代码之家  ›  专栏  ›  技术社区  ›  Aylwyn Lake

java通用<T>与通用相同?

  •  0
  • Aylwyn Lake  · 技术社区  · 9 年前

    根据java中的类型擦除理论,我认为以下两个代码段应该编译为同一个java类,以便具有相同的字节码。

    public class Generic {
        private Object t;
    
        public void hi() {
            System.out.println(t);
        }
    }
    

    javac通用.java

    mv通用。类Generic1.class

    public class Generic<T> {
        private T t;
    
        public void hi() {
            System.out.println(t);
        }
    }
    

    javac通用.java

    mv通用。类Generic2.class

    那么我的想法有什么问题吗?泛型是如何编译成字节码的?


    [编辑]

    javap-v很好的提示,谢谢。

    但我无法在短时间内对字节码有一个详细的了解。

    2 回复  |  直到 9 年前
        1
  •  1
  •   newacct    9 年前

    字节码 ,但字节码并不是类文件中唯一的内容。

    类文件还包含类及其成员的声明,包括类的超类和实现接口、其方法的参数和返回类型、其字段的类型等。所有这些声明都保留泛型(以便稍后可以检查针对该类单独编译的类)。所以类文件是不同的。

        2
  •  0
  •   serg.nechaev    9 年前

    类型擦除 (不是类型擦除)并不意味着您的两个示例将具有相同的字节码,它基本上意味着如果您可以为非泛型遗留类型手动进行类型转换,或者编译器将为参数化类型进行类型转换(没有运行时开销)。