Java - instanceof против Casting универсального класса во время выполнения:
В коде, извлеченном из полной ссылки Java Гербертом Шильдтом:
class Gen<T> {
T obj;
Gen(T o) {
ob = o;
}
T getob() {
return ob;
}
}
class Gen2<T> extends Gen<T> {
Gen2(T o) {
super(o);
}
}
class Test {
public static void main(String args[]) {
Gen2<Integer> obj = new Gen2<Integer>(99);
}
}
он упоминает, что instanceof не может проверить, принадлежит ли объект типизированному универсальному классу во время выполнения, потому что нет общей информации:
if (obj instanceof Gen2<Integer>) // illegal, doesn't compile
вы можете использовать только
if (obj instanceof Gen2<?>) // legal
Тем не менее, вы все равно можете привести тот же объект к (Gen), если он совместим:
(Gen<Integer>) obj // legal
но:
(Gen<Long>) obj // illegal
Разве это не противоречие Java? Если Java знает, что obj может быть приведен к Gen во время выполнения, почему он не знает, что obj является экземпляром класса / подкласса Gen?
1 ответ
Я прочитал книгу, смущенный этим тоже, я нашел это, возможно, полезным: https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html
Однако в некоторых случаях компилятор знает, что параметр типа всегда допустим и разрешает приведение. Например:
List<String> list1 = ...; ArrayList<String> list2 = (ArrayList<String>)list1; // OK