繁体   English   中英

Object.getClass()方法的签名

[英]signature of Object.getClass() method

Object类包含以下方法:

public final Class<? extends Object> getClass().

为什么这个方法的返回类型是Class<? extends Object> Class<? extends Object>

因为Java缺乏自我类型 (如果有它们,则返回类型为Class<? extends self_type> )。 所以签名只是声明了Class<?> ,它可以做的(下一个)最好的,这不太理想 - 编译器当然知道getClass()不返回任何类,而是一个类是静态的类调用getClass()的表达式的类型。

因此我们有这个奇点,由于语言的限制,方法的签名声明了Class<?> ,但编译器将返回值视为Class<? extends TheClass> Class<? extends TheClass>因为它知道它是安全的,并希望有所帮助:)

PS:你看过Class<? extends Object> Class<? extends Object>因为您在静态类型为Object的表达式上调用了getClass()

这实际上是JDK 1.5中的一个错误。 另请参阅此主题此bug报告 在一个坚果中,这个签名导致以下代码片段无法编译,而它应该

List<String> l1 = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();
System.out.println(l1.getClass() == l2.getClass()); // Incompatible types?

他们通过将返回类型更改为Class<?>而不是Class<? extends Object> Class<? extends Object>

因为,通用构造? extends Object ? extends Object匹配任何? extends Object Java对象。 由于Java中的所有内容都继承自Object,因此它会匹配类路径中加载的所有内容。 在这种情况下,不使用Class<? extends Object> Class<? extends Object> Object.getClass()方法只能返回Object类,而不能像大多数开发人员所期望的那样返回表示实际具体类型的Class对象。

实际签名(至少在1.6中)是

public final Class<?> getClass()

根据javadocs:

实际结果类型是Class,其中| X | 是调用getClass的表达式的静态类型的擦除。 例如,此代码片段中不需要强制转换:

数n = 0;
班级<? extends Number> c = n.getClass();

如果您没有参数化返回值,即使您在运行时可以获得类型信息,也必须进行强制转换。 所以上面的例子最终会成为

Class c = n.getClass(); //c now has no type information

getClass()方法(通常)用于检查类是否属于特定类型

MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();

if (myClass.getClass().equals(myClass2.getClass())
{
  // do stuff
}

返回类型是Class对象,因为您可以将它与其他Class对象进行比较。 它扩展了Object,因为一切都在Java中扩展了对象。

getClass()的另一个用途就是使用getName()

myClass1.getClass().getName() 

返回MyClass

它可以帮助您通过反射按字符串名称实现类

string className = myClass1.getClass().getName();
MyClass newInstance = (MyClass) Class.forName(className).newInstance();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM