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