gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:34:39 25 4
gpt4 key购买 nike

在 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/58533164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com