为什么第一行有效,第二行无效:
Class<? extends Class> c1 = (new Object()).getClass().getClass();
Class<? extends Class<? extends Class>> c2 = (new Object()).getClass().getClass().getClass();
为什么第一行有效,第二行无效:
Class<? extends Class> c1 = (new Object()).getClass().getClass();
Class<? extends Class<? extends Class>> c2 = (new Object()).getClass().getClass().getClass();
来自 API 文档Object.getClass
实际结果类型是 Class where |X| 是调用 getClass 的表达式的静态类型的擦除。
所以(new Object()).getClass()
会返回一个Class<? extends Object>
. 我们将呼吁getClass
这一点。所以X将是Class
,这将给我们Class<? extends Class>
。
Type mismatch: cannot convert from Class<capture#5-of ? extends Class> to
Class<? extends Class<? extends Class>>
这就是为什么。看起来原始打字在这里分开了。泛型在编译期间会被剥离。如果您添加所需的类型转换,它会再次起作用
Class<? extends Class<? extends Class>> c2 =
(Class<? extends Class<? extends Class>>) (newObject()).getClass().getClass().getClass();
Java 使用类型擦除。没有这样的事情
Class<? extends Class<? extends Class>>
实际上,只有Class<?>
. 其他一切都是虚拟的。
现在,具有三个泛型的类的对象Example<G1, G2, G3>
将在运行时只为您提供类型的保证Example<?,?,?>
- 请记住,泛型已在运行时被删除,即何时getClass()
被评估。
ArrayList<Integer> inta = new ArrayList<Integer>();
ArrayList<Double> doua = new ArrayList<Double>();
System.err.println(inta.getClass() == doua.getClass());
应该返回true
。因此,getClass()
也应该具有相同的类型:Class<ArrayList<?>>
. 外部类型是已知的,并且在运行时可用。泛型已被删除。
为避免编程错误,您可以强制转换类型:
Class<ArrayList<Double>> dacls = (Class<ArrayList<Double>>) doua.getClass();
但它仍然是与整数数组列表相同的类。