【问题标题】:Is type erasure done before the Java compiler does type checking?类型擦除是在 Java 编译器进行类型检查之前完成的吗?
【发布时间】:2016-11-28 01:27:30
【问题描述】:

这是一个代码示例:

public class TypeErasure<X extends String>{
    private X data;

    public TypeErasure(String s){
        this.data = s;
    }

据我说,在类型擦除之后,代码应该是这样的:

public class TypeErasure{
    private String data;

    public TypeErasure(String s){
        this.data = s;
    }

但是我得到一个编译时错误提示

Error:(139, 25) java: incompatible types: java.lang.String cannot be converted to X

一旦类型擦除完成,关于 X 的信息就会丢失,那么为什么编译器会报错呢?

【问题讨论】:

  • 您将X 声明为String 的子类型,然后将String 分配给该子类型的字段。这不是类型擦除的问题...
  • String 是最终类。 “X 扩展字符串”如何有效?
  • 我不明白为什么它不是类型擦除。编译器不会把X换成String吧?
  • @Amit No. 类型擦除意味着编译后,XObject 替换。
  • @ElliottFrisch 这回答了我的问题。谢谢。

标签: java type-erasure


【解决方案1】:

一旦类型擦除完成,关于 X 的信息就会丢失,那为什么编译器会报错呢?

您的观察回答了您的主要问题:

在 Java 编译器进行类型检查之前是否进行了类型擦除?

显然,类型检查发生在类型被擦除之前, 这就是你得到错误的原因。

您可以在相关documentation 的小节中阅读更多相关信息。

另请参阅this other answer 了解该主题。

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多