在Herbert Schildt的Java Complete Reference中提取的代码中:
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类/子类的实例?
答案 0 :(得分:-1)
我读过这本书,也对此感到困惑,我发现这可能对您有所帮助:https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#cannotCast
但是,在某些情况下,编译器知道类型参数始终有效并允许强制转换。例如:
List<String> list1 = ...; ArrayList<String> list2 = (ArrayList<String>)list1; // OK