gpt4 book ai didi

java - 为什么父类(super class)字段的泛型类型不会被删除到子类型中的具体绑定(bind)?

转载 作者:行者123 更新时间:2023-12-01 07:46:22 25 4
gpt4 key购买 nike

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如下。

最佳答案

发生这种情况是因为 type erasure .

Java 编译您的泛型类 B<T>转换为适合与可能引用它的所有类一起使用的字节代码,包括任何可能扩展 B<T> 的类.

T仅限于扩展 C 的类,Java 知道您可以分配的任何值 B.t将延长C ,因此它将您的类编译为等效的

class B {
C t;
}

此时 t 的任何赋值会工作;阅读自t会产生C但是,因此编译器必须执行一些“魔法”来解决此问题。具体来说,编译器会在子类型已知的位置插入类型转换。如果需要的话,它还可以生成桥接方法。有关详细信息,请参阅答案顶部的链接。

关于java - 为什么父类(super class)字段的泛型类型不会被删除到子类型中的具体绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51236343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com