¿Hay una manera de ocultar los métodos de Java en Kotlin?

Pietro Martinelli:

Estoy aprendiendo Kotlin y yo estoy leyendo este día Kotlin en acción . Al leer el capítulo sobre funciones de extensión y mejora de la biblioteca estándar, leí acerca de un comportamiento diferente expuesto por String.splitsobrecargas entre Java y Kotlin: Creo que es una muy buena idea de avanzar hacia una separación explícita y más de tipo guiado entre los delimitadores y basados en expresiones regulares basadas en sobrecargas.

Sobre esto, el libro que he mencionado más arriba dice que Kotlin esconde el método confuso y proporciona como sustitutos de varias extensiones sobrecargadas nombradas splitque tienen diferentes argumentos .

Funciones de extensión responden a la questione "¿Cómo puedo añadir método a una clase existente"; por el contrario, no puedo imaginar cómo possibile ocultar métodos proporcionados por la biblioteca estándar de Java .

Hice algunos intentos de escribir código simple, y me di cuenta de que

  1. val ks = "Pietro Martinelli" tiene ks::class.qualifiedName == "kotlin.String"
  2. val ks = "Pietro Martinelli" tiene ks::javaClass.name == "java.lang.String"
  3. pasando el valor anterior ksa un método Java, el parámetro recibido xtiene x.getClass().getName() == "java.lang.String"(como se esperaba)
  4. String js = "Pietro Martinelli"(en código Java) ha js.getClass().getName() == "java.lang.String", como se esperaba
  5. pasando el anterior jsvalor a un método Kotlin, el parámetro recibido ytiene y::class.qualifiedName == "kotlin.String"y y.getClass().getName() == "java.lang.String"(como hasta el momento esperado)

Por lo tanto: parece que (permítanme decir) algo mágico ocurrió cuando utilizo Stringvalores en Kotlin y de ida y vuelta desde Kotlin a Java. Si undestand correctamente, Stringliterales en Kotlin son instancias de kotlin.Stringpero están limitados a un tipo Java que se utiliza de forma transparente para las llamadas de método Java. Esta biblioteca Kotlin manera puede mejorar Stringla experiencia sin afectar java.lang.String: Java habituales [java.lang.]String.splitmétodos están ocultos al código Kotlin en el sentido de que los desarrolladores Kotlin ver [kotlin.]Stringcasos y sus métodos.

Así, dos (relacionados) pregunta: 1. Es mi entendimiento correcto? Y, más interesante 2. es sólo una especie de poner la magia en su lugar por el compilador, que sabe String s como instancias de un especial tipo y las envuelve detrás instancias de una clase diferente, o hay algún enfoque más general / mecánico que permite de alguna manera ocultar algún método de una clase de la misma manera que podemos añadir métodos a través de la función de extensión mecánico? Puede ser muy peligroso, así que creo que es sólo cuestión de que el compilador , pero puede ser de gran alcance, también, así que creo que vale la pena la pregunta.

Gracias de antemano por consejos y evaluaciones.

zsmb13:

Por desgracia, esto es magia compilador. Estos se llaman tipos mapeados , y el compilador les da un tratamiento especial para hacerlo de manera que sean visibles para el código Kotlin como los tipos Kotlin que han modificado las interfaces, a pesar de que en tiempo de ejecución que son instancias de los tipos regulares de Java cuando se compila a la JVM .

Aparte String, los ejemplos más notables son quizá las colecciones, que tienen dos capas de completamente nuevas interfaces aplican a ellos, a los de sólo lectura y mutables variantes.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=178464&siteId=1
Recomendado
Clasificación