Java 为什么基于Class.Class的角色转换有效,而不是getClass?
我有以下三个测试。前两个有效,后一个无效。我问这个问题的动机是,我希望能够强制转换对象Java 为什么基于Class.Class的角色转换有效,而不是getClass?,java,class,generics,casting,Java,Class,Generics,Casting,我有以下三个测试。前两个有效,后一个无效。我问这个问题的动机是,我希望能够强制转换对象A,这样当A已知为B的子类型时,它与对象B具有相同的类 @Test public void testWorks() { Object bar = "foobar"; String blah = (String) bar; System.out.println(blah); // Outputs foobar } @Test public void testAlsoW
A
,这样当A
已知为B
的子类型时,它与对象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<String> stringclass = (Class<String>) thetype.getClass();
Class stringclass=(类)thetype.getClass();
或
类状态
C.class
的类型,其中C
是类、接口或
数组类型(§4.3),是类
那么表达式的类型是什么呢
String.class
是类
Class
是一个泛型类,其中方法在其返回类型中使用泛型类型变量。那么
String.class.cast(bar);
是类型为T
的表达式,其中T
在此调用中已绑定到String
返回类型为ClassI'd because,因为.class在编译时求值,但.getClass()在运行时求值。编译器应该警告您使用原始类型class
,而不是参数化类型class
,这将提示您该声明有问题。
String.class.cast(bar);
Class<? extends String>
Class stringclass = thetype.getClass();
Class<? extends String> stringclass = thetype.getClass();