繁体   English   中英

为什么基于Class.class的转换工作但不是getClass?

[英]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.classClass对象将使用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();

由于变量stringclassraw,因此将删除依赖于泛型类型变量的方法的任何使用。

所以Class#cast(Object)现在有一个返回类型的Object ,它不能赋予String变量。

你做完了吗

Class<? extends String> stringclass = thetype.getClass();

你没事。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM