ll Ошибка 11 Ошибка II Ошибка ; 11 Предупреждение
Иногда такие проблемы удается обойти на программном уровне, но в отдельных случаях стирание приходится компенсировать посредством введения
Например, попытка использования instanceof в предыдущем примере завершилась неудачей из-за того, что информация о типе была стерта. При введении метки типа вместо instanceof можно использовать динамический метод islnstance():
//: generics/ClassTypeCapture.java
class Building {}
class House extends Building {}
public class ClassTypeCapture
public ClassTypeCapture(Class
}
public boolean f(Object arg) {
return kind.islnstance(arg);
}
public static void main(String[] args) { ClassTypeCapture
new CIassTypeCapture
new ClassTypeCapture
}
} /* Output; true true false true
Компилятор следит за тем, чтобы метка типа соответствовала обобщенному аргументу.
Создание экземпляров типов
Попытка создания newT() в Erased.java не работает отчасти из-за стирания, а отчасти из-за того, что компилятор не может убедиться в наличии у Т конструктора по умолчанию (без аргументов). Но в С++ эта операция естественна, прямолинейна и безопасна (проверка выполняется во время компиляции):
//; generics/InstantiateGenericType.java import static net.mindview.util.Print.*;
class ClassAsFactory
public ClassAsFactory(Class
try {
х = kind.newInstanceO; } catch(Exception е) {
throw new RuntimeException(e);
}
}
}
class Employee {}
public class InstantiateGenericType {
public static void main(String[] args) { ClassAsFactory
new ClassAsFactory
ClassAsFactory
new ClassAsFactory
print("ClassAsFactory
}
}
} /* Output:
ClassAsFactory
Программа компилируется, но с ClassAsFactory
//: generics/FactoryConstraint.java
interface FactoryI
}
class Foo2
public
}
// ...
class IntegerFactory implements FactoryI
return new Integer(O):
}
}
class Widget {
public static class Factory implements FactoryI
return new Widget О:
public class FactoryConstraint {
public static void main(String[] args) {
new Foo2
}
} ///:-
В сущности, это всего лишь разновидность передачи Class
Другое решение основано на использовании паттерна
//: generics/CreatorGeneriс.java
abstract class GenericWithCreate
GenericWithCreateO { element = createO; } abstract T createO;
}
class X {}
class Creator extends GenericWithCreate
System.out.pri nt 1 n(el ement.getClass().getSi mpleName()),
}
}
public class CreatorGeneric {