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.
问题是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)