¿Cómo funciona el borrado en Kotlin?

En Kotlin, el siguiente código comstack:

class Foo { fun bar(foo: List<String>): String { return "" } fun bar(foo: List<Int>): Int { return 2; } } 

Este código, sin embargo, no:

 class Foo { fun bar(foo: List<String>): String { return "" } fun bar(foo: List<Int>): String { return "2"; } } 

Comstackr esto provocará el siguiente error:

 Error:(8, 5) Kotlin: Platform declaration clash: The following declarations have the same JVM signature (foo(Ljava/util/List;)Ljava/lang/String;): fun foo(layout: List<Int>): String fun foo(layout: List<String>): String 

En Java, ninguno de los ejemplos se comstackrá:

 class Foo { String bar(List<Integer> foo) { return ""; } Integer bar(List<String> foo) { return 2; } } class Foo { String bar(List<Integer> foo) { return ""; } String bar(List<String> foo) { return "2"; } } 

Como era de esperar, ambos fragments anteriores generan el error familiar del comstackdor:

 Error:(13, 12) java: name clash: bar(java.util.List<java.lang.String>) and bar(java.util.List<java.lang.Integer>) have the same erasure 

Lo que me sorprende es que el primer ejemplo de Kotlin funciona y, en segundo lugar, si funciona, ¿por qué falla el segundo ejemplo de Kotlin? ¿Considera Kotlin el tipo de devolución de un método como parte de su firma? Además, ¿por qué las firmas de methods en Kotlin respetan el tipo de parámetro completo, en contraste con Java?

En realidad, Kotlin conoce la diferencia entre los dos methods en tu ejemplo, pero jvm no. Es por eso que es un choque de "plataforma".

Puede hacer su segunda compilation de ejemplo utilizando la anotación @JvmName :

 class Foo { @JvmName("barString") fun bar(foo: List<String>): String { return "" } @JvmName("barInt") fun bar(foo: List<Int>): String { return "2"; } } 

Esta anotación existe por esta misma razón. Puede leer más en la documentation de interoperabilidad .

  • Cómo mostrar datos usando la vista de tree de TornadoFX
  • ¿Los saltos de línea en cadenas sin formatting dependen de la plataforma?
  • Genéricos reificados en Scala 2.10
  • Modificadores de acceso Kotlin
  • RXJava ... emiten un observable cada segundo
  • RXJava Ignorar error y continuar en cadena
  • Cómo ejecutar la muestra Kotlin / Native win32
  • ¿Cómo convertir el método de la class <T> #cast de Java a Kotlin?
  • Kotlin + Spring Boot solicita sorting
  • La consulta de bases de datos en time real de Firebase no funciona
  • Las testings de Kotlin fallan desde la línea de command con ClassNotFoundException pero funcionan desde IntelliJ