java - 在 Kotlin 中实现 (/inherit/~extend) 注解

标签 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

最佳答案

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

关于java - 在 Kotlin 中实现 (/inherit/~extend) 注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51608924/

相关文章:

android - 在 kotlin 中调用父类中的内部类不起作用

Kotlin lambda/Java SAM 互操作 - 类型不匹配

kotlin - Kotlin中的Jinq-如何将Lambda转换为Java SerializedLambda?

java - PowerMock 不能与 JAXB Unmarshal 一起使用

Java 正则表达式非常慢(将嵌套量词转换为所有格量词)

java - 在基类中拥有对象实例 'hooks' 可以吗?

java - 如何使用对象类从多个列表中存储和检索数据?

java - 在 Android 中通过调用 Service 的公共(public)函数来向 Service 发送请求好不好?

android - 数据绑定(bind)和包含的布局 : Cannot find setter attribute for onClick

java.lang.VerifyError 尝试运行时需要精确引用阻止 Kotlin 在 Android 中暂停乐趣