gpt4 book ai didi

JVM 规范 : grammar for generic signatures requires lookahead

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

在通用签名规范中,ClassSignature有形式

ClassSignature:
[TypeParameters] SuperclassSignature {SuperinterfaceSignature}
TypeParameters:
< TypeParameter {TypeParameter} >
TypeParameter:
Identifier ClassBound {InterfaceBound}
ClassBound:
: [ReferenceTypeSignature]
InterfaceBound:
: ReferenceTypeSignature

因此可以省略类型参数的父类(super class)边界(一些 examples here )。

如果我有类声明public class A<T, LFooBar> ,Java 编译器生成签名 <T:Ljava/lang/Object;LFooBar:Ljava/lang/Object;>Ljava/lang/Object; .

IUC,可以省略类绑定(bind),在这种情况下,签名将为 <T:LFooBar:>Ljava/lang/Object; .

解析那个短签名需要向前看第二个 :为了知道T:LFooBar:是两个类型参数,而不是一个类型参数 T与类绑定(bind)FooBar .

也许在实践中,只有在有接口(interface)绑定(bind)的情况下才能放弃类绑定(bind)?对于 public class A<T extends Comparable<? super T>> , javac 产生签名 <T::Ljava/lang/Comparable<-TT;>;>Ljava/lang/Object; .但我想我不能依赖这个假设。

我是不是误会了什么?

最佳答案

如果您仔细观察,唯一可以跟在省略的 ReferenceTypeSignature 之后的是 Identifier>。由于 ReferenceTypeSignature 必须以 [ 开头或以 ; 结尾,并且标识符不能包含这些字符,而标识符必须后跟:,不能出现类型签名,这些选项之间没有歧义。

注意标识符可以以>开头,所以你需要向前看冒号来判断你是否在末尾TypeParameters。但这是一个单独的问题。

我不确定 JVM 是如何实现它的,但一种可能的方法是:

  • 检查第一个字符。如果它是 [,你有一个类型签名。如果是 >,则提前扫描第一个 [、; 或 :。如果您看到的第一个是 :,则表示您有标识符,否则您有类型参数结束。
  • 否则,先扫描;或者 :。如果是 :,则您有一个标识符,否则您有一个类绑定(bind)。

编辑:签名中的标识符不能包含 >,因此请忽略该位。 (它们也不能包含 :,这是另一个潜在的歧义来源)

关于JVM 规范 : grammar for generic signatures requires lookahead,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44284928/

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