java 对模板使用反射时出现编译错误
java compilation error when using reflection with templates
我有这个代码:
private <D extends Object> void foo(D d) throws IllegalAccessException, InstantiationException {
d = d.getClass().newInstance(); // Compilation error: "Incompatible types: Required D, Found: Object"
}
为什么会出现此错误?
据我了解,编译器知道 d 是 D 类型(它扩展了 Object)...?
刚刚cast
private <D extends Object> void foo(D d) throws IllegalAccessException, InstantiationException {
d = d.getClass().cast(d.getClass().newInstance()); // Compilation error: "Incompatible types: Required D, Found: Object"
}
javac
不知道什么是D
,会在运行时计算。
D
被编译器称为 ? extends Object
,因此 d.getClass()
的类型是 Class<? extends Object>
,因此 newInstance()
returns 和 Object
.正如 Victor 所指出的,您只需要在这里进行演员表 :)
旁注,这类代码通常是这样写的:
private <D> void foo(Class<D> clazz) throws InstantiationException, IllegalAccessException {
D d = clazz.newInstance();
}
因此,clazz
是 Class<D>
而不是 Class<? extends Object>
,并且 newInstance()
returns D
而不是 Object
.
我有这个代码:
private <D extends Object> void foo(D d) throws IllegalAccessException, InstantiationException {
d = d.getClass().newInstance(); // Compilation error: "Incompatible types: Required D, Found: Object"
}
为什么会出现此错误?
据我了解,编译器知道 d 是 D 类型(它扩展了 Object)...?
刚刚cast
private <D extends Object> void foo(D d) throws IllegalAccessException, InstantiationException {
d = d.getClass().cast(d.getClass().newInstance()); // Compilation error: "Incompatible types: Required D, Found: Object"
}
javac
不知道什么是D
,会在运行时计算。
D
被编译器称为 ? extends Object
,因此 d.getClass()
的类型是 Class<? extends Object>
,因此 newInstance()
returns 和 Object
.正如 Victor 所指出的,您只需要在这里进行演员表 :)
旁注,这类代码通常是这样写的:
private <D> void foo(Class<D> clazz) throws InstantiationException, IllegalAccessException {
D d = clazz.newInstance();
}
因此,clazz
是 Class<D>
而不是 Class<? extends Object>
,并且 newInstance()
returns D
而不是 Object
.