gpt4 book ai didi

java - Java 泛型中的删除

转载 作者:行者123 更新时间:2023-12-01 18:25:29 25 4
gpt4 key购买 nike

来自 Herbert Schildt 关于 Java 的书的摘要,

这两个类编译完成后,Gen中的T会被Object替换。中的 TGenStr 将替换为 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();
}

编辑:上面这两个是赫伯特书的输出。

//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;
}
}

在 Eclipse 中对这些文件运行 javap 后,我的结果是:

class erasure.Gen<T> {
T ob;

erasure.Gen(T);
Code:
0: aload_0
1: invokespecial #13 // Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: putfield #16 // Field ob:Ljava/lang/Object;
9: return

T getob();
Code:
0: aload_0
1: getfield #16 // Field ob:Ljava/lang/Object;
4: areturn
}

对于 GenStr.java :

 class erasure.GenStr<T extends java.lang.String> {
T str;

erasure.GenStr(T);
Code:
0: aload_0
1: invokespecial #13 // Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: putfield #16 // Field str:Ljava/lang/String;
9: return

T getstr();
Code:
0: aload_0
1: getfield #16 // Field str:Ljava/lang/String;
4: areturn
}

问题是我没有得到 Herbert Schildt 提到的输出。在上述场景中,我没有看到 T 被 Object 或 String 类替换。

最佳答案

"After running javap in eclipse on these files, my results are ..."

没有。这些是运行 javap -c 的结果。

6: putfield      #16                 // Field str:Ljava/lang/String;

你没看到吗?

1: getfield      #16                 // Field str:Ljava/lang/String;

还是那个?

关于java - Java 泛型中的删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26355958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com