¿Cuál es el uso previsto de @JvmSynthetic en Kotlin?

Me @JvmSynthetic anotación @JvmSynthetic en kotlin-stdlib, y me pregunto para qué sirve, pero, desafortunadamente, no está documentada.

Por lo que yo entiendo, aplicarlo a un elemento de progtwig agregará el modificador synthetic a los elementos de bytecode correspondientes. Como consecuencia, el elemento se vuelve invisible desde Java:

 class MyClass { @JvmSynthetic fun f() { } } 

En algún lugar del código de Java:

 MyClass c = new MyClass(); cf() // Error: cannot resolve method f() 

Pero los mismos elementos aún son visibles en el código de Kotlin:

 val c = MyClass() cf() // OK 

¿Es la ocultación de declaraciones de fonts ajenas a Kotlin un uso válido de @JvmSynthetic ? ¿Es el uso previsto? ¿Cuáles son los otros casos de uso apropiados?

Como @JvmSynthetic oculta las funciones de Java, tampoco se pueden sobrescribir en Java (y cuando se trata de un miembro abstract , las llamadas resultan en AbstractMethodError ). Dado que, ¿puedo usar @JvmSynthetic para prohibir replace a los miembros de una class Kotlin en fonts Java?

    En Java simple, synthetic methods synthetic son generados por el comstackdor javac . Normalmente, el comstackdor debe crear methods sintéticos en las classs anidadas, cuando la class adjunta accede a los campos especificados con el modificador privado.

    Dada la siguiente class en Java:

     public final class SyntheticSample { public static void main(final String[] args) { SyntheticSample.Nested nested = new SyntheticSample.Nested(); out.println("String: " + nested.syntheticString); } private static final class Nested { private String syntheticString = "I'll become a method!"; } } 

    cuando la class SyntheticSample accede al campo nested.syntheticString , de hecho está llamando a un método synthetic estático generado por el comstackdor (llamado algo así como access$100 ).

    Incluso si Kotlin expone una anotación @JvmSynthetic que puede "forzar" la creación de methods sintéticos, le aconsejo que no la use en el código de "usuario" normal. Los methods sintéticos son trucos de bajo nivel hechos por el comstackdor, y nunca debemos confiar en tales cosas en el código cotidiano. Creo que está ahí para apoyar otras partes de la biblioteca estándar, pero deberías preguntarle directamente a los chicos de JetBrains si tienes curiosidad (testing el foro oficial de discusión de Kotlin ).