2016-04-08 15 views
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 
    } 
} 

回答