【发布时间】:2018-07-08 22:07:40
【问题描述】:
package ir.openuniverse;
public class Main {
public static void main(String[] args) throws NoSuchFieldException {
System.out.println(A.class.getField("t").getType().getName());
}
}
class A extends B<D> {}
class B<T extends C> {
public T t;
}
class C {}
class D extends C {}
输出为ir.openuniverse.C。 为什么?我期待D!
编辑:
这个问题不是关于变通方法或替代方法。因此,答案与解决方法无关。有关替代方法,请参阅下面的myself answer。
【问题讨论】:
-
请编辑您的标题以描述您的实际问题。
-
比这更微妙:
T的类型在B的擦除中是独立于A的上下文确定的,其中T的范围更窄。如果您考虑到这一点,那一定是,因为编译器在不知道A的情况下编译B。 -
因为它在编译的时候已经被擦除到了自己的下限。
标签: java generics reflection type-erasure