5

私が取り組んでいるプログラミング言語のコンパイラの一部として、解析して 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 言語::の演算子については知っていますが、これはバイトコード レベルのものです。

4

1 に答える 1

9

ジェネリック型の境界を指定するために 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;

ソース

于 2015-02-12T19:43:47.853 に答える