当前位置: 首页 > 知识库问答 >
问题:

为什么字节码中保留了这个类型参数?

吕向荣
2023-03-14

打字擦除页面上说

如果类型参数是无界的,则用其边界或对象替换泛型类型中的所有类型参数。因此,生成的字节码只包含普通类、接口和方法。

但是,对于以下类别:

public class Foo<E extends CharSequence> {
    public E something;
}

javap-c Foo打印:

public class Foo<E extends java.lang.CharSequence> {
  public E something;
}

为什么类型参数没有替换为绑定(CharSequence),而是保留为E?

共有3个答案

商辰钊
2023-03-14

类型参数被保留,因为它必须为子分类所知。定义

public class Foo<E extends CharSequence> 

public class Foo<CharSequence> 

不相等,因为后者不允许将子类声明为,例如:

public class MyStringFoo extends Foo<String> { }

而前者有。

司徒志强
2023-03-14

类型信息保留在类和方法上,但不保留在实际变量上。如果你写

class Foo extends Bar<String> {
}

...您可以提取

new Bar<String>();

...您无法提取

向嘉誉
2023-03-14

你打印的不是字节码。它是方法签名。它被放在那里,这样编译器就可以在编译其他调用它的类时强制执行类型安全。

 类似资料:
  • 我们的软件正在通过一个从内存流读取数据的GZipStream解压某些字节数据。这些数据以4KB的块解压缩,并写入另一个内存流。 我们已经意识到进程分配的内存远高于实际解压的数据。 示例:具有2425536字节的压缩字节数组被解压缩为23050718字节。我们使用的内存分析器显示了方法MemoryStream。设置容量(Int32值)分配的67104936字节。这是保留内存和实际写入内存之间的2.9

  • 问题内容: 用Javadoc说: 如果使用该注释类型对类型进行注释,则编译器需要生成错误消息,除非… 为什么不是还是不够的,像。 问题答案: 该批注有两个目的。关于编译器和它产生的错误的确足以拥有一个, 因为在这方面它仅影响带有注释的类。 但是,它还有第二个目的,即记录以下事实:确实打算将其用作功能性接口,以及以这种方式使用它的可能性不仅是巧合,例如,并非旨在以这种方式使用。 因此,它带有注释并具

  • 它将把牌阵的一半分配给玩家和计算机(玩家得到前半部分,计算机得到后半部分)。现在这是先洗牌,所以是的,这似乎是公平的。 我得到的出界错误是这一行:

  • 我使用的是Java中的<code>或者</code>的本地实现,它有如下方法: 这两种方法可以编译并正常工作: 此方法不编译: 错误: (我去掉了包限定符,使错误更加易读) 我可以通过指定类型来编译它: 但我为什么需要这样做?我如何避免这种代码混乱?

  • 这是来自Java 以下是我的Java环境: java版本"1.8.0_60" Java(TM)SE运行时环境(build 1.8.0_60-b27) JavaHotSpot(TM)64位服务器VM(构建25.60-b23,混合模式)