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();
}

因此,clazzClass<D> 而不是 Class<? extends Object>,并且 newInstance() returns D 而不是 Object.