这段代码不会编译,我也不明白为什么。错误在指示的行:
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();