为什么getClass返回一个Class <! - ?延伸| X | - >?

时间:2016-06-13 18:25:16

标签: java

我试图了解getClass方法返回Class<? extends |X|>的原因是什么?

来自public final native Class<?> getClass();附近的openjdk

  

实际结果类型为Class<? extends |X|>   其中|X|是静态类型的擦除   调用getClass的表达式。

为什么getClass不能使用XClass.class之类的相同类型,例如:

class Foo {}
Foo fooInstance = new Foo();
Class<Foo> fc = Foo.class; // Works!
Class<Foo> fc2 = fooInstance.getClass(); // Type mismatch ;(
Class<?> fc3 = fooInstance.getClass(); // Works!
Class<? extends Foo> fc4 = fooInstance.getClass(); // Works!

1 个答案:

答案 0 :(得分:6)

Foo foo = new SubFoo();

您期望foo.getClass()返回什么? (它将返回SubFoo.class。)

这一点的一部分:getClass()返回真实对象的类,而不是引用类型。否则,您可以只编写引用类型,而foo.getClass()永远不会与Foo.class有任何不同,所以您只需编写第二个。

(顺便提一下,getClass()实际上在类型系统中有自己的特殊处理方式,而不是像其他任何方法一样,因为SubFoo.getClass()不会返回Foo.getClass()的子类型。)