当前位置: 首页 > 知识库问答 >
问题:

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

百里星纬
2023-03-14

在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 注释不能打开,因此也无法实现/扩展。

到目前为止,我发现< code>@Inherited是一个问题:

  • https://discuss.kotlinlang.org/t/inherited-annotations-and-other-reflections-enchancements/6209
  • https://youtrack.jetbrains.com/issue/KT-22265

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

我现在在这里也问了这个问题:https://discuse . kot linlang . org/t/implement-inherit-extend-annotation-in-kot Lin/8916

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

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

共有1个答案

督辉
2023-03-14

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

 类似资料:
  • 问题内容: 在Java中,我可以“实现”注释。 示例Java注释: 示例Java“实现”: 尝试将其移植到Kotlin无效,因为它说注释是最终的,因此不能被继承,即以下内容将不起作用: 您如何以Kotlin方式“实现/扩展”注释?找不到Kotlin在Java方面有所不同的任何原因。欢迎提供任何有关如何解决该问题的提示,也欢迎任何告诉您原因的信息。 以下问题包含此星座的用例:动态激发CDI事件,其成

  • 今天,我在kotlin中实现了一个,正如我过去在java中所做的那样,我希望实现一个,作为最后的后退,以防客户机代码忘记关闭它,从而使关键资源无法回收。我认为此资源足够重要,可以添加此回退,尽管此回退不可靠。但是,没有声明方法,这意味着我不能简单地做到这一点: 但是这种变通方法需要一个超类。如果下次我的其他已经获得了一个超类,那么如果没有大量的样板文件,这个变通方法将无法工作。

  • JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一。那么如何在JS中实现继承呢? JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个动物类 function Animal (name) { // 属性 this.name = name || 'Animal'; // 实例方法 this.sleep = function(){ c

  • 嗨,我是Kotlin世界的新手。我喜欢到目前为止所看到的,并开始考虑将我们在应用程序中使用的一些库从Java转换为Kotlin。 第二次更新:问题是如何用Kotlin中的一些参数为一个简单的pojo编写一个构建器设计模式?下面的代码是我的尝试,方法是编写java代码,然后使用eclipse-kotlin-plugin转换为Kotlin。

  • 在Java,你可以做这样的事情: 在Kotlin有可能做同样的事情吗?假设是抽象的,并且不实现

  • 我的Kotlin项目需要一个Java注释。 不幸的是,这似乎很困难。我在这里找到了这种讨论: https://discuss.kotlinlang.org/t/intdef-and-stringdef-not-being-checked-at-compile-time/7029/3 我明白这可能是一个Lint问题。不执行编译时检查。两人都没有提出任何建议。我可以添加任何字符串作为参数。 我最终用我