[英]Why does casting based on Class.class work but not getClass?
我有以下3个测试。 前两个工作,最后一个没有。 我提出这个问题的动机是,我希望能够投射对象A
,使其与对象B
具有相同的类,当A
被认为是B
的子类型时。
@Test
public void testWorks() {
Object bar = "foobar";
String blah = (String) bar;
System.out.println(blah); // Outputs foobar
}
@Test
public void testAlsoWorks() {
Object bar = "helloworld";
String blah = String.class.cast(bar);
System.out.println(blah); // Outputs helloworld
}
@Test
public void testfails() {
Object bar = "foobar";
String thetype = "hello";
Class stringclass = thetype.getClass();
String blah = stringclass.cast(bar); // Compiler error: incompatible types: Object cannot be converted to String
System.out.println(blah);
}
任何人都可以解释为什么最后一个案例在前两个案例成功时失败了,为什么会出现这种情况? 什么是更好的方法来实现这一目标?
您需要指定Class
的类型参数:
Class<String> stringclass = (Class<String>) thetype.getClass();
要么
Class<? extends String> stringclass = thetype.getClass();
java.lang.Class.cast(Object obj)
将对象强制转换为此Class对象所表示的类或接口。
如果不指定类型,则不会告诉编译器Class
实例stringclass
表示哪个类或接口。
调用String.class
, Class
对象将使用String
类型进行隐式参数化。
Java语言规范说明
C.class
的类型,其中C
是类,接口或数组类型(第4.3节)的名称,是Class<C>
。
所以表达式的类型
String.class
是Class<String>
。 Class
是一个泛型类,其中方法cast
在其返回类型中使用泛型类型变量。 所以结果
String.class.cast(bar);
是T
类型的表达式,其中T
已在此调用中绑定到String
。
Object#getClass()
的返回类型是Class<? extends T>
Class<? extends T>
其中T
是它被调用的表达式的擦除类型。
在这种情况下,就是这样
Class<? extends String>
但是,您将其分配给原始参考。
Class stringclass = thetype.getClass();
由于变量stringclass
是raw,因此将删除依赖于泛型类型变量的方法的任何使用。
所以Class#cast(Object)
现在有一个返回类型的Object
,它不能赋予String
变量。
你做完了吗
Class<? extends String> stringclass = thetype.getClass();
你没事。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.