2016-08-16 30 views
0

根据java中的类型擦除理论,我认为以下两个代码段应该编译为相同的java类,因此具有相同的字节码。java通用<T>与Generic相同吗?

public class Generic { 
    private Object t; 

    public void hi() { 
     System.out.println(t); 
    } 
} 

的javac Generic.java

MV Generic.class Generic1.class

public class Generic<T> { 
    private T t; 

    public void hi() { 
     System.out.println(t); 
    } 
} 

的javac Generic.java

MV Generic.class Generic2.class

比较Generic1.class和Generic2.class,它们是完全不同的。

那么我的想法有什么问题?以及通用如何编译为字节码?


[编辑]

javap的-v好的尖端,谢谢。

但在短时间内我无法获得与字节码的细节理解。

我想知道通用编译与删除对象。

+0

@ElliottFrisch我没有看到你提到的额外的演员 - '比较输出只给常量(那是什么事情开始哈希,是吧?)。不错的提示'javap -v'虽然! – Alec

回答

1

这里的类中的方法确实有相同的字节码,但字节码不是类文件中唯一的东西。

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

0

类型擦除(不键入擦除)并不意味着你的两个例子具有相同的字节码,这意味着基本上是如果你能做到型手动蒙上了非通用传统类型或编译器会做为您提供参数化类型(无运行时间开销)。

+0

实际上,它*确实意味着类将具有相同的字节码。但是,如果类型“T”返回给它们,则使用该类的代码可能不具有相同的字节码;但在这种情况下,由于'T'类型从不出现在公共接口中。 – newacct