„Е, най-накрая – още един малък урок за генеричните лекарства.“
„Сега ще ви кажа How да заобиколите изтриването на типа.“
"Ах. Това е нещо, което искам да знам."
"Както вероятно вече знаете, Java има тип Class, който се използва за съхраняване на препратка към клас на обект. "Ето няколко примера:"
Class clazz = Integer.class;
Class clazz = String.class;
Class clazz = "abc".getClass();
"Ах."
„Но това, което вероятно не знаете, е, че има и общ клас, наречен Class. И общите променливи на класа могат да съхраняват само препратки към типа, определен от аргумента тип. Ето няколко примера:“
Class<Integer> clazz1 = Integer.class; // Everything works well
Class<String> clazz2 = Integer.class; // Compilation error
Class<String> clazz1 = String.class; // Everything works well
Class<String> clazz2 = int.class; // Compilation error
Class<? extends String> clazz1 = "abc".getClass(); // Everything works well
Class<Object> clazz2 = "abc".getClass(); // Compilation error
"Защо работи така?"
„Е, стойността на полето клас за Integer (т.е. Integer.class) всъщност е Class<Integer> обект.“
— Но да продължим.
„Възползвайки се от факта, че Class<T> — е генеричен и че този тип променлива може да съдържа само стойност от тип T, можете да ги съберете заедно по изящен начин като този:“
class Zoo<T>
{
Class<T> clazz;
ArrayList<T> animals = new ArrayList<T>
Zoo(Class<T> clazz)
{
this.clazz = clazz;
}
public T createNewAnimal()
{
T animal = clazz.newInstance();
animals.add(animal);
return animal
}
}
Zoo<Tiger> zoo = new Zoo<Tiger>(Tiger.class); // This is where we pass the type!
Tiger tiger = zoo.createNewAnimal();
„Това не е супер сложна маневра – ние просто предаваме препратка към желания тип. Но ако просто използваме Class instead of Class<T>, тогава някой може случайно да предаде два различни типа: единият като T аргумент , а друга към конструктора."
„Ах. Разбирам. Нищо свръхестествено не се е случило, но и нищо ужасно. Има препратка към типа и можете да я използвате. Работи и това е достатъчно добро за мен.“
„Момчето става мъж! „Работи и това е достатъчно добро за мен“ често е най-добрият вариант.“
„Много неща могат да бъдат преработени в Java сега, но трябва да поддържаме съвместимост със стария code.“
„Десетките хиляди популярни полирани библиотеки са най-мощният аргумент за Java днес. По този начин Java остава най-популярният език, като поддържа обратна съвместимост, така че не може да въведе радикални иновации.“
„Е, ще създам моя собствена Java с блекджек и…“
„Добре, вече съм уморен от деня. До следващия път.“
„Довиждане, Риши, и благодаря за толкова интересния урок.“
GO TO FULL VERSION