在 Kotlin 中实现(/inherit/~extend) 注释

2022-09-04 22:58:57

在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 };
  }
}

尝试将其移植到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)
  }
}

你如何以 Kotlin 的方式“实现/扩展”注释?找不到任何理由说明为什么Kotlin在这方面与Java不同。任何关于如何解决这个问题的提示或任何说明为什么会这样的来源都是受欢迎的。

以下问题包含此类群的用例:使用带有成员的限定符动态触发 CDI 事件。基本上,您需要类似这样的东西来缩小应根据其成员触发的限定符的范围。

请注意,这也适用于 Kotlin 注释,以及似乎 Kotlin 注释不能打开,因此也无法实现/扩展。

到目前为止,我发现的只是一个问题:@Inherited

但是我没有找到任何理由说明为什么注释不像Java中那样可实现/可继承。

我现在也问了这个问题:https://discuss.kotlinlang.org/t/implement-inherit-extend-annotation-in-kotlin/8916

更新:最后,我发现了有关此设计决策的一些问题,即以下问题(当我为它打开自己的问题时):注释继承。禁止或正确实现。似乎决定是“禁止”它,即使没有关于该决定的评论,讨论或其他来源。

添加了以下问题:https://youtrack.jetbrains.com/issue/KT-25947


答案 1

从 Kotlin 1.3 开始,不支持这种情况。要创建注释的自定义实例,现在必须求助于Java。做出此设计决策的原因之一是制作注释接口过于特定于JVM,并且不能很好地映射到其他平台。


答案 2

推荐