Java - instanceof vs在运行时转换Generic类:

时间:2017-12-15 14:39:24

标签: java generics casting instanceof

在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类/子类的实例?

1 个答案:

答案 0 :(得分:-1)

我读过这本书,也对此感到困惑,我发现这可能对您有所帮助:https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#cannotCast

  

但是,在某些情况下,编译器知道类型参数始终有效并允许强制转换。例如:

List<String> list1 = ...;
ArrayList<String> list2 = (ArrayList<String>)list1;  // OK