Подписи байт-кода Java

Как часть компилятора для языка программирования, над которым я работаю, я наткнулся на общие подписи в байт-коде, который я пытаюсь разобрать и преобразовать в 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, но это что-то на уровне байт-кода.


person Clashsoft    schedule 12.02.2015    source источник
comment
Я предполагаю, что это связано с дженериками   -  person k_g    schedule 12.02.2015
comment
При реализации синтаксического анализатора для формального языка всегда следует обращаться к официальную спецификацию этого языка.   -  person Holger    schedule 13.02.2015


Ответы (1)


Существует определенный синтаксис, который изменился в 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;

Источник

person Obicere    schedule 12.02.2015