2015-01-21 101 views
1

是否有可能具有重载方法,每个接受功能和没有别的,例如重载方法科特林接收高阶函数

fun foo(a:() -> A) { } 
fun foo(b:() -> B) { } 

在Scala中这是不可能的,因为这些功能desugar到的Function0实例,并且由于擦除这些方法不能被消除。 Kotlin的情况是否如此,如果有的话,是否有解决方法?

回答

1

您可以解决在科特林签名冲突使用[platformName]注释:

import kotlin.platform.* 

class A 
class B 

[platformName("foo1")] 
fun foo(a:() -> A) { } 
fun foo(b:() -> B) { } 

请参阅该文档here

+0

安德烈,但仍科特林仅基于返回值不能选择合适的过载。至少不是没有在函数文字中明确指定类型。或者可以吗? – 2015-01-21 10:54:36

+0

@ ilya-ryzhenkov,不,如果你使用lambda表达式不行,但如果你传递了已经键入的值,它可以 – 2015-01-21 15:26:40

+0

'platformName'在后来Kotlin被重命名为'JvmName' – 2015-12-31 10:35:33