我有以下Java接口:
interface Action1<T> {
void call(T t);
}
interface Test<T> {
void test(Action1<? super T> action)
}
Run Code Online (Sandbox Code Playgroud)
以下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() }
}
}
Run Code Online (Sandbox Code Playgroud)
现在在函数中main,第一个语句编译,但IntelliJ发出警告,SAM构造函数可以用lambda替换.这将导致第二个陈述.
但是,这第二个语句不能编译,因为it有类型Any?,而不是A.删除out修饰符会使其再次编译.
为什么会这样?
这个用例是当实现类Main需要Test<B>为函数返回时a(),其中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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1770 次 |
| 最近记录: |