的类对象包含下列方法:签名()方法
public final Class<? extends Object> getClass().
为什么这种方法的返回类型是用于Class<? extends Object>
的类对象包含下列方法:签名()方法
public final Class<? extends Object> getClass().
为什么这种方法的返回类型是用于Class<? extends Object>
由于Java缺乏self types。 (如果有,则返回类型为Class<? extends self_type>
)。因此,仅仅签名声明Class<?>
,(下一个),最好是可以做的,这是不太理想 - 编译器肯定知道getClass()
不返回任何类,而是一类是静态类型的的亚型在其上调用getClass()
的表达式。
因此,我们有这个奇点,该方法的签名声明Class<?>
由于语言的限制,但是编译器将返回值作为Class<? extends TheClass>
因为它知道它是安全的,希望对大家有所帮助:)
PS:你看到了Class<? extends Object>
,因为你在一个静态类型为Object
的表达式上调用getClass()
。
就是这样。你的解释有助于理解Object#getClass的javadoc! – 2010-07-05 21:33:07
是的,谢谢Dimitris :) 我使用IDEA,当我要求从obj.getClass()创建一个变量时,它会自动创建一个Class <?扩展Obj>。 – 2010-07-05 21:38:49
啊,我刚刚加入PS:使其更清晰:)(顺便说一句,你好!) – 2010-07-05 21:39:40
的的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();
嗡嗡声,它不编译... – 2010-07-05 21:26:47
实际上,不编译 – kafka 2010-07-05 21:27:57
它只需使用'myclass instanceof MyClass'。 – 2010-07-05 21:29:25
因为,通用构造? extends Object
匹配扩展Object的任何Java对象。由于Java中的所有内容都是从Object继承的,因此它会匹配加载到类路径上的所有内容。在这种情况下,如果不使用Class<? extends Object>
,Object.getClass()
方法将只能返回对象类,而不像大多数开发人员所期望的那样返回代表实际具体类型的Class对象。
实际签名(在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
这实际上是JDK 1.5中的一个错误。另见this topic和this 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>
。
我刚刚看过Jdk(1.6 update 20)的实现,并且我看到getClass()方法返回一个类>。 – 2010-07-05 21:31:07