作为我正在开发的编程语言的编译器的一部分,我在字节码中遇到了通用签名,我正在尝试将其解析并转换为 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
在这些类的所有方法中,这些是唯一具有::
在他们的签名中。我的问题是这个令牌的用途以及它存在的原因。
Edit
我知道关于::
运算符在Java语言,但这是字节码级别的东西。
从 JSR 14 开始,定义的语法发生了变化,用于指定泛型类型的边界。
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;
Source
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)