2

为什么第一行有效,第二行无效:

Class<? extends Class> c1                  = (new Object()).getClass().getClass();
Class<? extends Class<? extends Class>> c2 = (new Object()).getClass().getClass().getClass();
4

3 回答 3

2

来自 API 文档Object.getClass

实际结果类型是 Class where |X| 是调用 getClass 的表达式的静态类型的擦除。

所以(new Object()).getClass()会返回一个Class<? extends Object>. 我们将呼吁getClass这一点。所以X将是Class,这将给我们Class<? extends Class>

于 2012-11-17T10:30:36.020 回答
0
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();
于 2012-11-17T09:10:25.820 回答
0

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();

但它仍然是与整数数组列表相同的类。

于 2012-11-17T10:37:57.797 回答