Реализовать (/inherit / ~extend) аннотацию в Котлине
в Java у меня есть возможность "реализовать" аннотации.
пример аннотации Java:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JavaClassAnno {
String[] value();
}
пример Java "внедрение":
class MyAnnotationLiteral
extends AnnotationLiteral<JavaClassAnno>
implements JavaClassAnno { // <--- works in Java
private String value;
public MyAnnotationLiteral(String value) {
this.value = value;
}
@Override
public String[] value() {
return new String[] { value };
}
}
попытка портировать это на Котлин не работает, так как он говорит, что аннотация является окончательной и поэтому не может быть унаследована, т. е. следующее не будет работать:
class MyAnnotationLiteral(private val internalValue: String)
: AnnotationLiteral<JavaClassAnno>(),
JavaClassAnno { // <--- doesn't work in Kotlin (annotation can not be inherited)
override fun value(): Array<String> {
return arrayOf(internalValue)
}
}
как вы" реализуете/расширяете " аннотации способом Котлина? Не удалось найти никаких причин, почему Котлин отличается в этом отношении Ява. Любой намек, как решить эту проблему или любые источники, которые говорят, почему это так, приветствуются.
следующий вопрос содержит вариант использования для этого созвездия:динамически огонь CDI событие с квалификатором с членами. В основном вам нужно что-то вроде этого, чтобы сузить, какой классификатор должен запускаться на основе его членов.
обратите внимание, что это также относится к аннотации Kotlin, а также кажется, что аннотация Kotlin не может быть открыта и поэтому не будет реализован / расширен.
то, что я нашел до сих пор достаточно упомянуть @Inherited
проблемы:
- https://discuss.kotlinlang.org/t/inherited-annotations-and-other-reflections-enchancements/6209
- https://youtrack.jetbrains.com/issue/KT-22265
но я не нашел никакой причины, почему аннотация не реализуема/наследуема, как в Java.
I и задал этот вопрос сейчас здесь: https://discuss.kotlinlang.org/t/implement-inherit-extend-annotation-in-kotlin/8916
Update: наконец, я нашел что-то относительно этого дизайнерского решения, а именно следующую проблему (в то время как я открывал для нее свою собственную проблему): наследование аннотаций. Либо запретить, либо реализовать правильно. Как кажется, решение было "запретить" его, хотя его нет (видно?) комментарии, обсуждения или другие источники насчет этого решения.
добавлена следующая проблема:https://youtrack.jetbrains.com/issue/KT-25947
1 ответов
по состоянию на Kotlin 1.3, этот случай не поддерживается. Чтобы создать пользовательские экземпляры аннотаций, нужно пока прибегнуть к Java. Одна из причин этого проектного решения заключается в том, что создание интерфейсов аннотаций слишком специфично для JVM и не будет хорошо сопоставляться с другими платформами.