为什么第一行有效但不是第二行:
Class<? extends Class> c1 = (new Object()).getClass().getClass();
Class<? extends Class<? extends Class>> c2 = (new Object()).getClass().getClass().getClass();
答案 0 :(得分:2)
实际结果类型是Class,其中| X |是擦除调用getClass的表达式的静态类型。
因此(new Object()).getClass()
将返回Class<? extends Object>
。我们将打电话给getClass
。因此 X 将为Class
,这将为我们提供Class<? extends Class>
。
答案 1 :(得分: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();
答案 2 :(得分: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();
但是它仍然是与整数arraylist相同的类。