如何堆栈getClass()

时间:2012-11-17 09:00:08

标签: java

为什么第一行有效但不是第二行:

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

3 个答案:

答案 0 :(得分:2)

来自Object.getClass

的API文档
  

实际结果类型是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相同的类。