java - 为什么基于 Class.class 的转换有效但 getClass 无效?

标签 java class generics casting

我有以下 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 对象表示的类或接口(interface)。

如果不指定类型,您就不会告诉编译器 Class 实例 stringclass 代表什么类或接口(interface)。

当您调用 String.class 时,Class 对象被隐式参数化为 String 类型。

关于java - 为什么基于 Class.class 的转换有效但 getClass 无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26263048/

相关文章:

Java 压缩/解压缩大文件 (>1gb)

c++ - 如何从另一个函数访问一个函数中的内容,在 C++ 中从第三个调用

php - 如何在多个文件中扩展 PHP 类并在命名空间中标记每个扩展?

c++ - 无法在函数调用之外更改节点参数

generics - 如何使用接口(interface)映射记录

Java XML-RPC 和原始类型

java - 在 2 个对象中使用相同的通用通配符

java - 重定向 html 页面

java - HttpServletRequest#getParts() jsp 始终返回空集合

java - 将 jakarta.mail 1.6.5 更新到 2.0.1