【发布时间】:2017-08-12 12:14:53
【问题描述】:
在 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";
}
}
不出所料,前面的两个 sn-ps 都会产生熟悉的编译器错误:
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 相比,为什么 Kotlin 中的方法签名尊重完整的参数类型?
【问题讨论】:
-
除了其他答案之外,返回类型不会添加到 Java 中的方法签名中。
标签: kotlin