为什么第一行有效,第二行无效:
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();
但它仍然是与整数数组列表相同的类。