当前位置: 首页 > 面试题库 >

在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事件,其成员带有qualifier。基本上,您需要类似这样的内容来缩小应基于其成员触发的限定符。

请注意,这也将适用于Kotlin批注,并且似乎Kotlin批注似乎无法打开,因此也无法实现/扩展。

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

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

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

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

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

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


问题答案:

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



 类似资料:
  • 在Java中,我可以“实现”注释。 示例 Java 注释: 示例 Java“实现”: 尝试将其移植到 Kotlin 不起作用,因为它说注释是最终的,因此不能被继承,即以下内容将不起作用: 如何以Kotlin的方式“实现/扩展”注释?找不到Kotlin与Java在这方面存在差异的任何原因。欢迎任何关于如何解决这个问题的提示或任何说明为什么会这样的消息来源。 以下问题包含此星座的用例:使用带有成员的限

  • 今天,我在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问题。不执行编译时检查。两人都没有提出任何建议。我可以添加任何字符串作为参数。 我最终用我