[英]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.