ho ottenuto le seguenti interfacce Java:Sostituzione SAM-costruttore con lambda di tipo covariante
interface Action1<T> {
void call(T t);
}
interface Test<T> {
void test(Action1<? super T> action)
}
E la seguente classe 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() }
}
}
Ora nella funzione main
, le prime compilazioni istruzione , ma IntelliJ avvisa che il costruttore SAM può essere sostituito con un lambda. Ciò comporterebbe la seconda affermazione.
Tuttavia, questa seconda istruzione non viene compilata, poiché it
ha il tipo Any?
, non A
. La rimozione del modificatore out
lo ricompone.
Perché succede?
Il caso di utilizzo di questo è quando la classe di attuazione di Main
deve restituire per la funzione a()
, dove B
implementa 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
}
}