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

时间:2014-09-05 14:52:35

标签: 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);
        }
    }

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

从声明中可以明确fromRow必须是T类型。变量mo必须与T类型相同。

为什么不能将反射实例化的新实例分配给mo?我假设fromRow.getClass()返回的类对象是Class<T>,而newInstance() - 应该实例化T的新实例。

2 个答案:

答案 0 :(得分:5)

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

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

Class<T> cl = (Class<T>)fromRow.getClass();
mo = cl.newInstance();

mo = (T)fromRow.getClass().newInstance();

答案 1 :(得分:3)

这是因为type erasure - 运行时JVM不知道fromRow的类型;在指定的代码点,JVM(编译器)只能假设它是可以扩展DB的东西。因此,您需要执行其他答案中建议的内容(强制转换或传递确切类型)。