Java:不会编译 - 必须兼容的不兼容类型

sco*_*ttb 3 java generics casting

这段代码不会编译,我不明白为什么.错误位于指定的行:

   static <T extends DB> T createModelObjectFromCopy(T fromRow) {
            T mo = null;
            try {
   -->          mo = fromRow.getClass().newInstance();
            } catch (InstantiationException | IllegalAccessException ex) {
                Logger.getLogger(DBTypes.Table.class.getName()).log(Level.SEVERE, null, ex);
            }
            return Table.initializeFromCopy(mo, fromRow);
        }
    }
Run Code Online (Sandbox Code Playgroud)

fromRow 是一个包装不可变类型的值对象.

从声明中可以清楚地知道fromRow必须是类型T.变量mo必须是完全相同的类型T.

为什么不能将反射实例化的新实例分配给mo?我认为通过返回的类对象fromRow.getClass()Class<T>newInstance()-should-实例化的新实例T.

das*_*ght 5

问题是fromRow.getClass()返回Class<? extends DB>,而不是Class<T>:编译器不足以做出推断.

由于您知道结果将是正确的类型,因此您可以使用强制转换来强制转换.有两种方法可以做到这一点:

Class<T> cl = (Class<T>)fromRow.getClass();
mo = cl.newInstance();
Run Code Online (Sandbox Code Playgroud)

要么

mo = (T)fromRow.getClass().newInstance();
Run Code Online (Sandbox Code Playgroud)

  • 实际上`newInstance()`会返回`?扩展DB` - 因为类型擦除确实会丢失类型,而不是它绑定到的类型(DB). (2认同)