当我创建一个类a的示例并试图访问它的getclass()方法时,它的返回类型与java对象类中提到的不同。
A a = new A() ;
Class<? extends A> clazz = a.getClass();
即使我在intellij中访问上面提到的getclass方法,它也会说它的返回类型是 Class<? extends A>
甚至javadoc也说它返回通配符扩展上限。我完全可以接受。因为我可以创建b的示例并引用a和访问getclass方法。
但是为什么getclass方法的返回类型只是 Class<?>
在对象类中
编辑1(在安迪·特纳的评论之后)
Class A {
List<?> returningNullList() {
return null;
}
}
当我创建一个示例,并尝试访问returningnulllist()方法时,它没有给我返回类型 List<? extends A>
. 但当我试图访问getclass方法时,它说返回类型是 Class<? extends A>
尽管实际的硬编码返回类型是 Class<? >
在object.java文件中
getclass方法是否被编译器特别处理?
2条答案
按热度按时间yh2wf1be1#
但是为什么getclass方法的返回类型只是
Class<?>
在对象类中Class<?>
与相同Class<? extends Object>
,因为所有类(除了Object
)有Object
作为一个超类。没有理由显式地包含该绑定。chy5wohz2#
阅读文档,即
getClass()
在课堂上Object
:实际结果类型为
Class<? extends |X|>
哪里|X|
是对其上的表达式的静态类型的擦除getClass
被称为。例如,此代码片段中不需要强制转换:粗体字来自javadoc,不是我加的。
为了班级
Object
它本身意味着返回类型是Class<? extends Object>
,但自从Class<?>
是的缩写Class<? extends Object>
,javadoc简单地显示了速记。引用java语言规范第4.5.1节。参数化类型的类型参数:
通配符
? extends Object
等价于无界通配符?
.