9
我有以下的Java接口:更換SAM-構造與拉姆達與協變型
interface Action1<T> {
void call(T t);
}
interface Test<T> {
void test(Action1<? super T> action)
}
而下面的科特林類:
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()
,其中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
}
}