作为我正在研究的编程语言的编译器的一部分,我在字节码中发现了通用签名,我正试图将其解析并转换为AST。解析算法基本上是有效的,但似乎有一种特殊情况,即这些签名的格式表现得有点奇怪。以下是其中的几个案例:
java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable<-TT;>;>([TT;)V
java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable<-TT;>;>([TT;II)V
java.lang.Class#getAnnotation: <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)TA;
java.lang.Class#getAnnotationsByType: <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)[TA;
java.lang.Class#getDeclaredAnnotation: <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)TA;
java.lang.Class#getDeclaredAnnotationsByType: <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)[TA;
java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable<-TT;>;>([TT;)V
java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable<-TT;>;>([TT;II)V
java.util.Collections#sort: <T::Ljava/lang/Comparable<-TT;>;>(Ljava/util/List<TT;>;)V
在这些类中的所有方法中,只有这些方法的签名中包含::
。我的问题是这个代币的作用以及它为什么存在。
编辑
我知道Java语言中的::
运算符,但这是字节码级别的东西。
有一个定义的语法在JSR14中进行了更改,以指定泛型类型的边界。
variable_name:class_type_bound:interface_type_bounds
因此,对于您的示例:
<T::Ljava/lang/Comparable<-TT;>;>
这将反映:
<T extends Comparable<T>>
变量名为T
,没有类类型绑定,因此省略了它,并且有一个类型为Comparable<T>
的接口绑定。
你所有的例子都遵循这个,但有很多不同的形式:
<T:Ljava/lang/Object;>(Ljava/util/Collection<TT;>;)TT;
<T::Ljava/lang/Comparable;>(Ljava/util/Collection<TT;>;)TT;
<T:Ljava/lang/Object;:Ljava/lang/Comparable;(Ljava/util/Collection<TT;>;)TT;
源