在 Kotlin 中实现 (/inherit/~extend) 注解
Implement (/inherit/~extend) annotation in Kotlin
在 Java 我有可能 "implement" 注释。
示例 Java 注释:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JavaClassAnno {
String[] value();
}
示例 Java "implementation":
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 };
}
}
尝试将其移植到 Kotlin 是行不通的,因为它说注解是最终的,因此不能被继承,即以下内容将行不通:
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)
}
}
您如何 "implement/extend" 注释 Kotlin 方式?找不到 Kotlin 在这方面与 Java 不同的任何原因。欢迎任何提示如何解决该问题或任何说明为什么会这样的来源。
以下问题包含此星座的用例:Dynamically fire CDI event with qualifier with members。
基本上你需要这样的东西来缩小应该根据其成员触发的限定符。
请注意,这也适用于 Kotlin 注释,而且 Kotlin 注释似乎无法打开,因此也不会 implemented/extended。
到目前为止,我发现 @Inherited
是一个问题:
- https://discuss.kotlinlang.org/t/inherited-annotations-and-other-reflections-enchancements/6209
- https://youtrack.jetbrains.com/issue/KT-22265
但我没有找到任何原因说明为什么注释不是 implementable/inheritable,因为它在 Java.
我现在也在这里问了这个问题:https://discuss.kotlinlang.org/t/implement-inherit-extend-annotation-in-kotlin/8916
更新:最后我发现了一些关于这个设计决定的东西,即以下问题(当我为它打开我自己的问题时):Annotations inheritance. Either prohibit or implement correctly。似乎决定 "prohibit" 它,即使没有(可见?)关于该决定的评论、讨论或其他来源。
从 Kotlin 1.3 开始,不支持这种情况。要创建注释的自定义实例,现在必须求助于 Java。做出此设计决定的原因之一是使注释接口过于特定于 JVM,无法很好地映射到其他平台。
在 Java 我有可能 "implement" 注释。
示例 Java 注释:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JavaClassAnno {
String[] value();
}
示例 Java "implementation":
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 };
}
}
尝试将其移植到 Kotlin 是行不通的,因为它说注解是最终的,因此不能被继承,即以下内容将行不通:
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)
}
}
您如何 "implement/extend" 注释 Kotlin 方式?找不到 Kotlin 在这方面与 Java 不同的任何原因。欢迎任何提示如何解决该问题或任何说明为什么会这样的来源。
以下问题包含此星座的用例:Dynamically fire CDI event with qualifier with members。 基本上你需要这样的东西来缩小应该根据其成员触发的限定符。
请注意,这也适用于 Kotlin 注释,而且 Kotlin 注释似乎无法打开,因此也不会 implemented/extended。
到目前为止,我发现 @Inherited
是一个问题:
- https://discuss.kotlinlang.org/t/inherited-annotations-and-other-reflections-enchancements/6209
- https://youtrack.jetbrains.com/issue/KT-22265
但我没有找到任何原因说明为什么注释不是 implementable/inheritable,因为它在 Java.
我现在也在这里问了这个问题:https://discuss.kotlinlang.org/t/implement-inherit-extend-annotation-in-kotlin/8916
更新:最后我发现了一些关于这个设计决定的东西,即以下问题(当我为它打开我自己的问题时):Annotations inheritance. Either prohibit or implement correctly。似乎决定 "prohibit" 它,即使没有(可见?)关于该决定的评论、讨论或其他来源。
从 Kotlin 1.3 开始,不支持这种情况。要创建注释的自定义实例,现在必须求助于 Java。做出此设计决定的原因之一是使注释接口过于特定于 JVM,无法很好地映射到其他平台。