【发布时间】:2016-04-08 09:46:37
【问题描述】:
我有以下 Java 接口:
interface Action1<T> {
void call(T t);
}
interface Test<T> {
void test(Action1<? super T> action)
}
还有以下 Kotlin 类:
interface A {
fun go()
}
abstract class Main {
abstract fun a(): Test<out A>
fun main() {
a().test(Action1 { it.go() })
a().test { it.go() }
}
}
现在在函数 main 中,第一条语句编译,但 IntelliJ 发出警告,SAM 构造函数可以替换为 lambda。
这将导致第二个语句。
但是,第二条语句无法编译,因为it 的类型为Any?,而不是A。删除 out 修饰符使其再次编译。
为什么会这样?
这个用例是Main的实现类需要为函数a()返回Test<B>,其中B实现A:
class B : A {
override fun go() {
TODO()
}
}
class MainImp : Main() {
override fun a(): Test<out A> {
val value: Test<B> = object : Test<B> {
override fun test(action: Action1<in B>?) {
TODO()
}
};
return value
}
}
【问题讨论】:
标签: kotlin