如何强制Kotlin调用Java接口中指定的execute重载方法?
Kotlin 调用 Java 泛型重载方法的歧义解决办法
Java 接口中声明的两个execute重载,因为Consumer<M>和Function<M,R>都支持Kotlin的SAM转换,编译器优先匹配返回值为Unit的Consumer版本,才会出现类型不匹配的编译错误。以下是三种符合Kotlin语法规范的明确指定重载的写法,无需额外声明中间变量:
- 方案1:显式标注lambda参数类型
在lambda中声明参数的具体类型,编译器即可自动推断匹配Function版本的重载:
val x: Int = myContract.execute(SomeClass::class.java) { it: SomeClass -> 1 }
- 方案2:显式指定SAM构造器
直接使用Function的显式SAM构造器包裹lambda,完全消除重载歧义:
val x: Int = myContract.execute( SomeClass::class.java, Function<SomeClass, Int> { 1 } )
- 方案3:用
as关键字做类型标注
如果偏好紧凑写法,可以直接对lambda做类型强制声明:
val x: Int = myContract.execute(SomeClass::class.java, { 1 } as Function<SomeClass, Int>)
以上三种写法均为Kotlin官方支持的标准语法,不会产生兼容问题,也不需要额外的样板代码。
内容的提问来源于stack exchange,提问作者diziaq
相关产品推荐
相关产品推荐

