return类型与实际的returntype不同

kg7wmglp  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(421)

当我创建一个类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方法是否被编译器特别处理?

yh2wf1be

yh2wf1be1#

但是为什么getclass方法的返回类型只是 Class<?> 在对象类中 Class<?> 与相同 Class<? extends Object> ,因为所有类(除了 Object )有 Object 作为一个超类。没有理由显式地包含该绑定。

chy5wohz

chy5wohz2#

阅读文档,即 getClass() 在课堂上 Object :
实际结果类型为 Class<? extends |X|> 哪里 |X| 是对其上的表达式的静态类型的擦除 getClass 被称为。例如,此代码片段中不需要强制转换:

Number n = 0;
Class<? extends Number> c = n.getClass();

粗体字来自javadoc,不是我加的。
为了班级 Object 它本身意味着返回类型是 Class<? extends Object> ,但自从 Class<?> 是的缩写 Class<? extends Object> ,javadoc简单地显示了速记。
引用java语言规范第4.5.1节。参数化类型的类型参数:
通配符 ? extends Object 等价于无界通配符 ? .

相关问题