Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么基于Class.Class的角色转换有效,而不是getClass?_Java_Class_Generics_Casting - Fatal编程技术网

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();