2017-06-02 1 views
2

Warum kann ich Lambda für die Klasse java.lang.Thread verwenden, aber nicht für MyThread?Warum verhalten sich Lambda-Ausdrücke für Kotlin- und Java-Klassen anders?

interface MyRunnable{ 
    fun run() 
} 

class MyThread(runnable : MyRunnable){  
} 

fun test(){ 
    Thread({})  // All Alright 

    MyThread({}) //Exception. Type mismatch <<-- Why ? 
} 

Link zu diesem Beispiel zu überprüfen: https://try.kotlinlang.org/#/UserProjects/tbs79qfkh50psp7r3qrdrinrmt/sfkpjq1bjvg4r6d5rmnu6mp4a8

+0

Wie: https://StackOverflow.com/Questions/44190468 –

+0

Wie: https://StackOverflow.com/Questions/44189319 –

Antwort

4

Aus der Dokumentation auf SAM conversions:

Beachten Sie, dass diese Funktion nur für Java-Interop funktioniert; Da Kotlin über geeignete Funktionstypen verfügt, ist die automatische Konvertierung von Funktionen in Implementierungen von Kotlin-Schnittstellen unnötig und wird daher nicht unterstützt.

Mit anderen Worten: { ... } Syntax wird nur für Anrufe auf Java unterstützt. Die öffentliche Begründung ist, dass Sie beide tun könnten:

  1. Haben Sie Ihren MyThread Konstruktor nimmt einen erstklassigen Funktionstyp als Parameter.

  2. Verwenden Sie ein object expression:

    MyThread(object : MyRunnable { 
        override fun run() {} 
    }) 
    

Das ist natürlich ziemlich ausführlich. Nach dem Kotlin-Ticket ist die Lambda-Syntax jedoch nur ein Teil der Java-Interoperabilität, nicht Teil der Kernsprache, also würde ein sorgfältiger Entwurf für etwas mehr nötig sein.

+0

'MyRunnable' sollte wahrscheinlich ein funktionaler Typ sein + vielleicht ein Typalias, der das vermeidet insgesamt ausgeben. Siehe auch https://stackoverflow.com/questions/44323826/why-i-cant-use-lambda-for-interface-at-kotlin/. –

+0

@Oliver, wenn Sie die +1 tun möchten, die Sie erwähnt haben, finden Sie unter https://youtrack.jetbrains.com/issue/KT-7770 –

+0

@jayson - bereits fertig :) (obwohl auch, wenn Sie zu gehen bearbeite die Antworten, tu das bitte so, dass das Ergebnis typografisch noch Sinn macht!) –

Verwandte Themen