这段代码不会编译,我也不明白为什么。错误在指示的行:

   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的新实例。

最佳答案

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

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

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

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

10-07 23:36