首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在字节码中保留此类型参数?

为什么在字节码中保留此类型参数?
EN

Stack Overflow用户
提问于 2014-11-05 22:02:17
回答 4查看 725关注 0票数 8

类型擦除页

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

然而,对于以下课程:

代码语言:javascript
运行
复制
public class Foo<E extends CharSequence> {
    public E something;
}

javap -c Foo打印:

代码语言:javascript
运行
复制
public class Foo<E extends java.lang.CharSequence> {
  public E something;
}

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

EN

回答 4

Stack Overflow用户

发布于 2014-11-05 22:30:38

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

票数 8
EN

Stack Overflow用户

发布于 2014-11-05 22:30:47

类型信息保留在类和方法上,而不是在实际字段上。如果你写

代码语言:javascript
运行
复制
class Foo extends Bar<String> {
}

...you可以在运行时提取Bar<String>,但如果您有

代码语言:javascript
运行
复制
new Bar<String>();

...you不能在此提取Bar<String>

票数 2
EN

Stack Overflow用户

发布于 2022-07-09 10:27:13

我同意@ answer 207421的答案。可以通过尝试以下代码来区分原始类型和完整泛型类型:

代码语言:javascript
运行
复制
public class App {
    public static void main(String args[]) {
        Foo raw = new Foo(Something);
    }
}

当您检查这个类的字节码时,您会发现缺少E。所以这是一种原始类型。这些原始类型没有限制,甚至可能需要转换,因此可能引发异常。这就是为什么使用泛型;以确保类型安全。这是一个完整的源代码机制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26767992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档