Rol*_*and 9 java kotlin kotlin-interop
在Java中,我有可能"实现"注释.
示例Java注释:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JavaClassAnno {
String[] value();
}
Run Code Online (Sandbox Code Playgroud)
示例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 };
}
}
Run Code Online (Sandbox Code Playgroud)
试图将其移植到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)
}
}
Run Code Online (Sandbox Code Playgroud)
你如何"实施/扩展"Kotlin方式的注释?无法找到任何理由为什么Kotlin在这方面与Java有所不同.任何提示如何解决这个问题的提示或任何说明原因的方法都是受欢迎的.
以下问题包含此星座的用例:使用带成员的限定符动态触发CDI事件.基本上你需要这样的东西来缩小哪个限定符应根据其成员触发.
请注意,这也适用于Kotlin注释,并且似乎Kotlin注释无法打开,因此也无法实现/扩展.
到目前为止我发现的是@Inherited
一个问题:
但是我没有找到任何理由为什么注释不能像Java一样可实现/可继承.
我现在也问这个问题:https://discuss.kotlinlang.org/t/implement-inherit-extend-annotation-in-kotlin/8916
更新:最后我找到了关于这个设计决定的内容,即下面的问题(当我为它开启我自己的问题时):注释继承.禁止或正确实施.因为似乎决定"禁止"它,即使没有(可见?)评论,讨论或其他有关该决定的消息来源.
从 Kotlin 1.3 开始,不支持这种情况。要创建注释的自定义实例,目前必须求助于 Java。做出此设计决策的原因之一是,制作注释接口过于特定于 JVM,并且无法很好地映射到其他平台。
归档时间: |
|
查看次数: |
583 次 |
最近记录: |