当前位置: 首页 > 面试题库 >

通用类型存储在Java类文件中的什么位置?

陈开宇
2023-03-14
问题内容

我很清楚,编译时从Java代码中删除了泛型类型。1.5+ JVM使用什么信息(属性?)来实现getGenericType等等?


问题答案:

它们存储在Signature属性中;请参阅更新的Java虚拟机规范的 4.8.8节,以及有关字段类型签名格式的4.4.4节。

这是一个使用示例javap -verbose java.util.Map

public interface java.util.Map
  SourceFile: "Map.java"
  Signature: length = 0x2
   00 1E 
  [other attributes omitted]

Signature此处的属性指定(如果您将其读为big-endian,就像JVM类文件格式中的所有整数一样)恒定池值#30(30 =
0x1E)。因此,让我们看一下:

const #30 = Asciz       <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;;

请阅读4.4.4中指定的语法。因此,这使用了两个类型参数,K extends java.lang.ObjectV extends java.lang.Object。类型本身(Map)也扩展了class java.lang.Object,并且没有接口。



 类似资料:
  • 问题内容: 通过Swift编程语言,我惊讶地发现,与结构和枚举不同,类不支持存储的类型属性。 这是其他OO语言的共同特征,因此我认为有充分的理由他们决定不允许它。但是我无法猜测出这个原因是什么,尤其是由于结构(和枚举)拥有它们。 难道仅仅是Swift的早期开发,还没有实现吗?还是在语言设计决策背后有更深层的原因? 顺便说一句,“存储类型属性”是Swift术语。在其他语言中,这些可能称为类变量。示例

  • 我有一个这样的 txt 文件 163钱滴24 454快乐112 45 没有你什么都没有 56 第一个数字是歌曲的id,我想将其存储为整数,第二个数字是字符串!这不是一个词!第三个是整数,它是歌曲的点赞数。我想将它们存储在一个数组中,但当我使用scanner方法时,我会逐字存储它们,当歌曲有名字时 有什么方法可以读取 txt 文件,将第一个数字存储为 int,然后扫描整个字符串(歌曲名称),直到下一

  • 本文向大家介绍HTML5存储类型有什么区别?相关面试题,主要包含被问及HTML5存储类型有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 1)HTML5能够本地存储数据,在之前都是使用cookie使用的,HTML5提供了下面两种本地存储方案: 2) localStorage用于持久化的本地存储,数据永远不会过期,关闭浏览器也不会丢失。 3) sessionStorage 同一个会话的页面才能

  • 问题内容: 抱歉,标题似乎令人困惑,但请按示例进行操作。 假设我有一些带有通用类型参数的Java类: 我可以创建一个类型为存储对象的变量,并将通用参数设置为。Java还允许我将该变量分配给另一个变量,但将通用参数设置为通配符类型: 但是,在使用具有泛型参数的类时,如果将该参数的类型设置为泛型,则无法将该类的对象分配给相同类型/泛型的类型,后者(内部/嵌套)参数是通配符类型: 具体的编译错误是: 凭

  • 问题内容: 在任何Web浏览器中,执行以下脚本都会导致将其发送到控制台。在Node中发送。 我意识到在这种情况下,在Node中引用导出对象。我确实知道该变量,而这不是我要访问的变量。此外,以上脚本也未在全局对象上设置。到底去哪儿了?我可以在上面的脚本中显式访问它,但似乎完全没有理由将其藏在某些非标准空间中。 我还意识到,删除对象上的will声明是预期的行为,尽管在顶级范围内将其值存储在与“ nak

  • 问题内容: 我注意到了Collections.sort的规格: 为什么这里需要“ ”?如果是extend ,那么我们是否不能保证a 仍然能够比较两个对象而没有“ ”部分? 换句话说,给出以下代码: 为什么即使不为Collections.sort()的声明指定“ ”,编译器也不足够聪明地知道这是可以的? 问题答案: Josh Bloch今年在Google I / O上做了一个名为“ 有效Java重新