2010-07-05 88 views
3

的类对象包含下列方法:签名()方法

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

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

+1

我刚刚看过Jdk(1.6 update 20)的实现,并且我看到getClass()方法返回一个类。 – 2010-07-05 21:31:07

回答

3

由于Java缺乏self types。 (如果有,则返回类型为Class<? extends self_type>)。因此,仅仅签名声明Class<?>,(下一个),最好是可以做的,这是不太理想 - 编译器肯定知道getClass()不返回任何类,而是一类是静态类型的的亚型在其上调用getClass()的表达式。

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

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

+0

就是这样。你的解释有助于理解Object#getClass的javadoc! – 2010-07-05 21:33:07

+0

是的,谢谢Dimitris :) 我使用IDEA,当我要求从obj.getClass()创建一个变量时,它会自动创建一个Class <?扩展Obj>。 – 2010-07-05 21:38:49

+0

啊,我刚刚加入PS:使其更清晰:)(顺便说一句,你好!) – 2010-07-05 21:39:40

0

的的getClass()方法(通常)检查如果一个类是一种特殊类型

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

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

的返回类型是Class对象,因为你可以把它比作其他类对象。它扩展了Object,因为所有东西都在Java中扩展对象

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

myClass1.getClass().getName() 

回报MyClass

它可以帮助你通过反射由字符串名称实例化类

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

嗡嗡声,它不编译... – 2010-07-05 21:26:47

+0

实际上,不编译 – kafka 2010-07-05 21:27:57

+0

它只需使用'myclass instanceof MyClass'。 – 2010-07-05 21:29:25

1

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

1

实际签名(在1.6至少)是

public final Class<?> getClass() 

据的Javadoc:

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

Number n = 0;
类<?扩展Number> c = n。的getClass();

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

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

这实际上是JDK 1.5中的一个错误。另见this topicthis bugreport。在一个螺母,这个签名是引起下面的代码片段没有编译同时应该

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

他们固定在1.6通过改变返回类型Class<?>,而不是Class<? extends Object>