2016-04-08 8 views
9

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 
    } 
} 

risposta