我在一本书中碰到了以下内容-
//Here, T is bound by Object by default.
class Gen<T> {
T ob; // here, T will be replaced by Object
Gen(T o) {
ob = o;
}
//Return ob.
T getob() {
return ob;
}
}
// Here, T is bound by String.
class GenStr<T extends String> {
T str; // here, T will be replaced by String
GenStr(T o) {
str = o;
}
T getstr() { return str; }
}
编译完这两个类后,
T
中的Gen
将替换为Object
。中的T
GenStr
将替换为String
。您可以通过在编译后运行javap
来确认这一点类。结果显示在这里:
class Gen extends java.lang.Object{
java.lang.Object ob;
Gen(java.lang.Object);
java.lang.Object getob();
}
class GenStr extends java.lang.Object{
java.lang.String str;
GenStr(java.lang.String);
java.lang.String getstr();
}
但是,我看到了
public class GenStr<T extends java.lang.String> {
T str;
GenStr(T);
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: putfield #2 // Field str:Ljava/lang/String;
9: return
T getstr();
Code:
0: aload_0
1: getfield #2 // Field str:Ljava/lang/String;
4: areturn
}
class Gen<T> {
T ob;
Gen(T);
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: putfield #2 // Field ob:Ljava/lang/Object;
9: return
T getob();
Code:
0: aload_0
1: getfield #2 // Field ob:Ljava/lang/Object;
4: areturn
}
为什么
.class
文件仍然显示Formal Type参数<T>
? 最佳答案
为什么.class文件仍然显示Formal Type参数?
简单:这样
类型擦除是指以下事实:不保留有关用于实例化的泛型类的特定类型的信息。但是该类是通用的信息需要在类文件中。在编译器看不到Gen.java而是Gen.class的情况下,编译器又如何知道
Gen
是通用的呢?