此代码无法编译,我也不明白为什么。错误位于指示的行:
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
的新实例。
答案 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的东西。因此,您需要执行其他答案中建议的内容(强制转换或传递确切类型)。