Я пытался понять объявление 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. Я могу думать о нескольких значениях этого, но синтаксис выглядит слишком странным, чтобы рассуждать о них. Заранее спасибо!