¿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 .

  • Errores de ejemplo de inicio de Ktor
  • Fundición genérica de Kotlin a una subclass más específica
  • String.intern () devuelve diferentes valores en un controller JDBC
  • Error al detectar exception en la llamada asíncrona Anko (Kotlin)
  • ¿Cuál es el `it` en el cuerpo de Kotlin lambda?
  • ¿Qué pasa con Room Database en Kotlin?
  • La biblioteca de Android escrita en Kotlin, proporciona soporte para aplicaciones Java
  • No se puede comstackr Android Project con Kotlin en TeamCity
  • Kotlin: ¿Cómo puede una class secundaria usar la function de extensión de un padre en la llamada del super constructor?
  • Establecer text en EditText Kotlin, Android
  • Kotlin JPA encapsula OneToMany