Java 14 Спецификация языка Аннотация Элемент Объяснение - Возможно Опечатка? - PullRequest
4 голосов
/ 15 апреля 2020

Я пытался понять объявление AnnotationTypeDeclaration в спецификации языка Java. https://docs.oracle.com/javase/specs/jls/se14/html/jls-9.html#jls -AnnotationTypeElementDeclaration

Он гласит:

AnnotationTypeElementDeclaration:
{AnnotationTypeElementModifier} UnannType Identifier ( ) [Dims] [DefaultValue] 

Согласно этой подписи - выражение Dims может быть помещено между Identifier и defaultValue и кажется правильным написать такой элемент аннотации:

package com.example.demo;

import java.lang.annotation.*;

@interface RequiredValue {
    String value() @Required[] default "default value";
}

@Target({ElementType.TYPE, ElementType.TYPE_USE})
@interface Required {

}

Однако компилятор выдает следующую ошибку:

Incompatible types. Found: 'com.example.demo.Required', required: 'java.lang.String @com.example.demo.Required []'

После попытки исправить эту ошибку и вот что у меня было:

package com.example.demo;

import java.lang.annotation.*;

@interface RequiredValue {
    Required value() @Required[] default @Required;
}

@Target({ElementType.TYPE, ElementType.TYPE_USE})
@interface Required {

}

Как вы можете легко заметить, мне пришлось изменить тип элемента value() на Required. И теперь код просто компилируется без ошибок.

Также можно опустить определение defaultValue.

@interface RequiredValue {
    Required value() @Required[] default @Required;
    Required name() @Required[];
}

Итак - какой смысл иметь Dims (@Required[] в примере) и для чего это нужно? Я не видел строку кода Java, которая практически выглядит как приведенный выше пример. Мой вопрос просто вытекает из спецификации языка Java и моего любопытства, чтобы лучше узнать язык Java. Я могу думать о нескольких значениях этого, но синтаксис выглядит слишком странным, чтобы рассуждать о них. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вы можете заменить заголовки методов, такие как public int[] sort(int[] arr), на что-то вроде public int sort(int arr[]) []. Два эквивалентны. Java имеет некоторый странный альтернативный синтаксис массива, потому что он хотел, чтобы C программисты чувствовали себя комфортно.

РЕДАКТИРОВАТЬ: Согласно @ Sotir ios Delimanolis, аннотация @Required применяется к измерениям массива, так что это не почти так же, как и тип возврата @Required String[]

Итак, ваша аннотация:

@interface RequiredValue {
    //Notice it's an array here              v
    String value() @Required[] default {"default value"};
}

в основном эквивалентна этому:

@interface RequiredValue {
    @Required String[] value() default {"default value"};
}

Это просто Причуда Java.

0 голосов
/ 20 апреля 2020

Итак, подведем итог: проблема заключается в том, что язык Java сам по себе является заменой языка C ++, следовательно, сохраняет синтаксис массива в стиле C.

...