Kotlin Sam

A SAM is an interface with a Single Abstract Method
Sam是Java 8 支持Lambda語法的一種方式。Kotlin是號稱100%兼容Java的榴芳,自然也就兼容Java 8 的Sam接口嗡靡。
舉例說明
Callback.java:Java的Sam接口

public interface Callback {
    void callback(String a, int b);
}

JavaCallbackCall.java Java中調(diào)用Sam接口

public class JavaCallbackCall {
    public void call(Callback callback) {
        callback.callback("", 0);
    }
}

Kotlin方法參數(shù)是Java的Sam接口

fun kotlinCallSam(callback: Callback) {
    callback.callback("", 0)
}

具體的調(diào)用

fun main(args: Array<String>) {
    javaCall()
    kotlinCall()
}
fun kotlinCall() {
    //一開始我們會這樣寫,傳遞一個對象
    kotlinCallSam(object : Callback {
        override fun callback(a: String?, b: Int) {}
    })
    //IDEA提示我們優(yōu)化
    kotlinCallSam(Callback { a, b -> })
    //因為參數(shù)沒有用到窟感,所以用_代替
    kotlinCallSam(Callback { _, _ -> })
}
fun javaCall() {
    //一開始我們會這樣寫讨彼,傳遞一個對象
    JavaCallbackCall.call(object : Callback {
        override fun callback(a: String?, b: Int) { }
    })
    //IDEA提示我們優(yōu)化
    JavaCallbackCall.call { a, b ->}

    //因為參數(shù)沒有用到,所以用_代替
    JavaCallbackCall.call { _, _ -> }
}

Kotlin接口是不支持Sam的
SamKotlinInterface.kt

interface SamKotlinInterface {
    fun callback(a: String, b: Int)
}

調(diào)用

fun callKotlinSamInterface(samKotlinInterface: SamKotlinInterface) {
    samKotlinInterface.callback("", 0)
}
fun main(args: Array<String>) {
    //正確的用法
    callKotlinSamInterface(object : SamKotlinInterface {
        override fun callback(a: String, b: Int) {
        }
    })
    //錯誤的用法
    callKotlinSamInterface(SamKotlinInterface { a, b -> })
}

Note

1.SAM轉(zhuǎn)換只適合接口柿祈,并不能適用于抽象類
2.Kotlin接口不支持Sam哈误,因為Kotlin有更優(yōu)秀的高階函數(shù)

參考

1.https://stackoverflow.com/questions/44562745/how-to-implements-a-java-sam-interface-in-kotlin
2.https://discuss.kotlinlang.org/t/kotlin-and-sam-interface-with-two-parameters/293
3.https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市躏嚎,隨后出現(xiàn)的幾起案子蜜自,更是在濱河造成了極大的恐慌,老刑警劉巖卢佣,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件重荠,死亡現(xiàn)場離奇詭異,居然都是意外死亡虚茶,警方通過查閱死者的電腦和手機戈鲁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門仇参,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人婆殿,你說我怎么就攤上這事诈乒。” “怎么了鸣皂?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵抓谴,是天一觀的道長暮蹂。 經(jīng)常有香客問我寞缝,道長,這世上最難降的妖魔是什么仰泻? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任荆陆,我火速辦了婚禮,結(jié)果婚禮上集侯,老公的妹妹穿的比我還像新娘被啼。我一直安慰自己,他們只是感情好棠枉,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布浓体。 她就那樣靜靜地躺著,像睡著了一般辈讶。 火紅的嫁衣襯著肌膚如雪命浴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天贱除,我揣著相機與錄音生闲,去河邊找鬼。 笑死月幌,一個胖子當著我的面吹牛碍讯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扯躺,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捉兴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了录语?” 一聲冷哼從身側(cè)響起倍啥,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钦无,沒想到半個月后逗栽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡失暂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年彼宠,在試婚紗的時候發(fā)現(xiàn)自己被綠了鳄虱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡凭峡,死狀恐怖拙已,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摧冀,我是刑警寧澤倍踪,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站索昂,受9級特大地震影響建车,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜椒惨,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一缤至、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧康谆,春花似錦领斥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孽锥,卻和暖如春嚼黔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忱叭。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工隔崎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人韵丑。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓爵卒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撵彻。 傳聞我的和親對象是個殘疾皇子钓株,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容