En Java tengo la posibilidad de anotaciones "poner en práctica".
Muestra la anotación de Java:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JavaClassAnno {
String[] value();
}
Java de ejemplo "aplicación":
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 };
}
}
Tratando de puerto que a Kotlin no funciona, ya que dice que la anotación es definitiva y por lo tanto no puede ser hereditaria, es decir, el siguiente no funcionará:
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)
}
}
¿Cómo se "implementa / extender" la forma anotaciones Kotlin? No se pudo encontrar ninguna razón por la cual se diferencia en que Kotlin respecto a Java. Cualquier indicio de cómo resolver ese problema o cualquier fuente que le dicen por qué es de esa manera son bienvenidos.
La siguiente pregunta contiene un caso de uso de esta constelación: dinámicamente evento CDI fuego con clasificación con los miembros . Básicamente, usted necesita algo como esto para reducir el calificador debe dar lugar a la base de sus miembros.
Tenga en cuenta que esto también se aplicaría a una anotación de Kotlin, así como parece que una anotación de Kotlin no puede ser abierto y por lo tanto no puede implementar / extendido demasiado.
Lo que he encontrado hasta ahora es bastante mencionar @Inherited
como problema:
- https://discuss.kotlinlang.org/t/inherited-annotations-and-other-reflections-enchancements/6209
- https://youtrack.jetbrains.com/issue/KT-22265
Pero no he encontrado ninguna razón por la anotación no es implementable / heredable, ya que es en Java.
También hice esta pregunta ahora aquí: https://discuss.kotlinlang.org/t/implement-inherit-extend-annotation-in-kotlin/8916
Actualización: Finalmente he encontrado algo con respecto a esta decisión de diseño, es decir, el problema siguiente (mientras se estaba abriendo mi propio problema para ella): Anotaciones herencia. Prohibir o poner en práctica correctamente . Como parece que la decisión era "prohibir" que, a pesar de que no hay visibles (?) Comentarios, discusiones u otras fuentes sobre esa decisión.
Añadido el problema siguiente: https://youtrack.jetbrains.com/issue/KT-25947
A partir de Kotlin 1.3, no se admite este caso. Para crear variaciones propias de las anotaciones que uno tiene que recurrir a Java por ahora. Una de las razones de esta decisión es que el diseño de interfaces hacer anotaciones JVM es demasiado específica y no asignar así a otras plataformas.