java Generic<T> 和 Generic 一样吗?
java Generic<T> same as Generic?
根据 java 中的类型擦除理论,我认为以下两个代码片段应该编译为相同的 java class 因此具有相同的字节码。
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,完全不同
所以我的想法有什么问题? Generic 如何编译成字节码?
[编辑]
javap -v 很好的提示,谢谢。
但是我无法在短时间内详细了解字节码。
我想知道 Generic 是否使用 T erase 编译为 Object。
类型擦除(不是类型擦除)并不意味着您的两个示例将具有相同的字节码,这基本上意味着如果您可以为非泛型手动进行类型转换遗留类型或编译器将为您完成参数化类型(无运行时开销)。
此处 classes 中的方法确实具有相同的 字节码,但字节码并不是 class 文件中唯一的内容。
class文件还包含class及其成员的声明,包括class的超classes和实现接口,参数和return 其方法的类型、其字段的类型等。所有这些声明都保留泛型(以便稍后可以检查 classes 针对此 class 单独编译)。所以 class 个文件不同。
根据 java 中的类型擦除理论,我认为以下两个代码片段应该编译为相同的 java class 因此具有相同的字节码。
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,完全不同
所以我的想法有什么问题? Generic 如何编译成字节码?
[编辑]
javap -v 很好的提示,谢谢。
但是我无法在短时间内详细了解字节码。
我想知道 Generic 是否使用 T erase 编译为 Object。
类型擦除(不是类型擦除)并不意味着您的两个示例将具有相同的字节码,这基本上意味着如果您可以为非泛型手动进行类型转换遗留类型或编译器将为您完成参数化类型(无运行时开销)。
此处 classes 中的方法确实具有相同的 字节码,但字节码并不是 class 文件中唯一的内容。
class文件还包含class及其成员的声明,包括class的超classes和实现接口,参数和return 其方法的类型、其字段的类型等。所有这些声明都保留泛型(以便稍后可以检查 classes 针对此 class 单独编译)。所以 class 个文件不同。