在Kotlin中实现(/继承/〜扩展)注释

时间:2018-07-31 08:34:24

标签: java kotlin kotlin-interop

在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方面有所不同的任何原因。欢迎提供任何有关如何解决该问题的提示,也欢迎任何告诉您为什么这样做的消息来源。

以下问题包含此星座的用例:Dynamically fire CDI event with qualifier with members。 基本上,您需要执行类似的操作来缩小根据其成员触发的限定符。

请注意,这同样适用于Kotlin注释,而且似乎Kotlin注释无法打开,因此也无法实现/扩展。

到目前为止,我发现是将@Inherited称为问题:

但是我没有找到为什么注释不能像Java中那样实现/继承的任何原因。

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

更新:最终,我发现了有关此设计决策的内容,即以下问题(在我为之准备的同时):Annotations inheritance. Either prohibit or implement correctly。似乎该决定是“禁止”该决定的,即使没有(可见的)评论,讨论或其他有关该决定的消息。

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

1 个答案:

答案 0 :(得分:1)

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