В Kotlin следующий код компилируется:
class Foo {
fun bar(foo: List<String>): String {
return ""
}
fun bar(foo: List<Int>): Int {
return 2;
}
}
Этот код, однако, не делает:
class Foo {
fun bar(foo: List<String>): String {
return ""
}
fun bar(foo: List<Int>): String {
return "2";
}
}
При компиляции это приведет к следующей ошибке:
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
В Java ни один пример не будет компилироваться:
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";
}
}
Неудивительно, что оба предыдущих фрагмента генерируют знакомую ошибку компилятора:
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
Что меня удивляет, так это то, что первый пример Kotlin вообще работает, а во-вторых, если он работает, почему второй пример Kotlin не работает? Котлин рассматривает метод возвращаемого типа как часть его подписи? Кроме того, почему сигнатуры метода в Kotlin учитывают полный тип параметра, в отличие от Java?