删除在Kotlin中如何工作?

在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是否将方法的返回类型视为其签名的一部分? 此外,为什么Kotlin中的方法签名要尊重完整的参数类型,与Java相比?

实际上Kotlin知道你的例子中两种方法的区别,但是jvm不会。 这就是为什么这是一个“平台”的冲突。

您可以使用@JvmName注释来编译第二个示例:

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

这个注释存在这个原因。 您可以在互操作性文档中阅读更多内容 。