类型擦除在java中是如何工作的?

类型擦除在java中是如何工作的?,java,generics,type-erasure,Java,Generics,Type Erasure,我正在讨论一个关于打字擦除的话题 该编译器删除与类或方法中的类型参数和类型参数相关的所有信息 现在考虑下面的代码 public class Box<T> { private T t; // lineA, T stands for "Type" public void add(T t) { // lineB this.t = t; // lineC } public T get() { // lineD return

我正在讨论一个关于打字擦除的话题 该编译器删除与类或方法中的类型参数和类型参数相关的所有信息

现在考虑下面的代码

public class Box<T> {
    private T t; // lineA, T stands for "Type" 

    public void add(T t) { // lineB
        this.t = t; // lineC
    }

    public T get() { // lineD
        return t; // lineE
    }
}
现在在上面的代码中(在
类和
main
方法中),编译器将在哪一行进行哪些更改

正如链接所说,编译器在编译时会删除类或方法中与类型参数和类型参数相关的所有信息
将编译
Box
类,它将分别从
Box
类和
main
方法中删除所有
T
发生的事件吗?如果是,删除
T
后编译的代码是什么?

类型擦除在编译时发生。Java编译器从源代码中删除这些泛型类型信息,并根据需要添加类型转换,并交付字节码。因此,生成的字节码将没有关于类型参数和参数的任何信息它看起来像没有泛型的旧java代码。无法在运行时确定T的值,因为该信息在编译代码之前被删除。

类型擦除发生在编译时。Java编译器从源代码中删除这些泛型类型信息,并根据需要添加类型转换,并交付字节码。因此,生成的字节码将没有关于类型参数和参数的任何信息它看起来像没有泛型的旧java代码。无法在运行时确定T的值,因为在编译代码之前,该信息会被删除。

如果没有像示例代码中那样的类型边界,那么在Box类中(大致)会发生什么,方法代码中对
T
的所有引用的所有实例都将替换为Object。在使用Box类的代码中,
等的所有实例都将被删除


一篇关于Java泛型的详尽深入的文章是——它还解释了类型边界的影响以及更多内容。

如果没有像示例代码中那样的类型边界,那么(大致)会发生什么情况:在Box类中,方法代码中对
T
的所有引用的所有实例都将被Object替换。在使用Box类的代码中,
等的所有实例都将被删除


一篇关于Java泛型的详尽深入的文章是——它还解释了类型边界的影响,还有很多其他方面。

示例中的第4行行不通。它将触发编译器错误,因为类型(
Box
Box
)不匹配。在大多数情况下,类型擦除意味着字节码不需要知道泛型类型(生成一些额外的代码),但在许多方面,它就像将注释擦除称为功能一样类型擦除不是功能,“泛型”是。类型擦除是在实现泛型时做出的一种设计选择,用表达性换取二进制兼容性。示例中的第4行行不通。它将触发编译器错误,因为类型(
Box
Box
)不匹配。在大多数情况下,类型擦除意味着字节码不需要知道泛型类型(生成一些额外的代码),但在许多方面,它就像将注释擦除称为功能一样类型擦除不是功能,“泛型”是。类型擦除是在实现泛型时做出的一种设计选择,它以表现力换取二进制兼容性。为了完整性,代码将包含一些类型边界遗留的信息,以及“超级类型标记”()。这意味着在某些相当特定的情况下,您可以恢复T的值。对,我想我的意思是,没有“可靠”的方法来确定类型。为了完整性,代码将包含一些类型边界遗留的信息,以及“超级类型标记”()。这意味着在某些相当特殊的情况下,你可以恢复T的值。对,我想我的意思是没有“可靠”的方法来确定类型。是的,我同意所有的实例都将被删除,所有对T的引用都将被Object替换。但编译Box类后,编译器仍然会有一些元数据信息,这样当它被其他类(如上例中的main method)引用时,它会应用编译时检查。对吗?@Mohit:您可能是对的,类型擦除影响的是方法代码而不是签名。我将编辑我的答案以更正此问题。同意删除的所有实例,所有对T的引用都将被Object替换。但编译Box类后,编译器仍然会有一些元数据信息,这样当它被其他类(如上例中的main method)引用时,它会应用编译时检查。对吗?@Mohit:您可能是对的,类型擦除影响的是方法代码而不是签名。我将编辑我的答案以更正此问题。
Box<String> box1 = new Box<String>(); // line1
box1.add("Scott"); // line2
String s1tr=box1.get(); // line3

Box<Integer> box2 = new Box<Integer>(); // line4
box2.add(1); // line5
Integer k=box2.get(); // line6