2017-06-02 4 views
2

sehen, ich eine Java-Klasse haben:Warum kann ich nicht Lambda für Schnittstelle bei Kotlin verwenden?

public final class JavaReceiveSingle { 
    public static void useSingle(Single single) { 
     single.doSth(); 
    } 
    public static void useSingle2(SingleInterface singleInterface) { 
     singleInterface.doSth(); 
    } 
} 

eine Java-Schnittstelle:

public interface SingleInterface { 
    void doSth(); 
} 

eine Kotlin Schnittstelle:

interface Single { 
    fun doSth() 
} 

Jetzt kann ich Lambda in einer Kotlin Klasse wie verwenden:

JavaReceiveSingle.useSingle2({}) 

Aber wenn ich will, das Gleiche tun Schnittstelle Kotlin:

JavaReceiveSingle.useSingle({}) 

IDE Fehler zeigen: Erforderlich: Single! Gefunden:() -> Einheit

Und wenn ich angeben Einzel wie:

JavaReceiveSingle.useSingle(Single{}) 

Noch Fehler: Schnittstelle Einzelne nicht über Konstrukte!

Obwohl der folgende Code funktioniert:

JavaReceiveSingle.useSingle(object :Single{ 
    override fun aa() {} 
}) 

Aber warum kann ich nicht Lambda für eine Kotlin Schnittstelle verwenden?

+0

Kotlin hat funktionale Typen, e. G. '() -> Unit' ist eine Funktion, die keine Parameter akzeptiert und Unit zurückgibt (kein Wert). Auf diese Weise sind funktionale Schnittstellen und SAM-Konvertierungen überflüssig. –

+0

Also in diesem Fall wird empfohlen, funktionale Typen zu ersetzen traditionelle innere anonyme Klasse? Wenn ja, dann verstehe ich es – user2699165

Antwort

1

Gegenwärtig wird SAM conversion für in Kotlin definierte Schnittstellen nicht unterstützt. Es gibt ein Problem dafür in YouTrack, aber derzeit würde ich empfehlen, funktionale Typen anstelle von Single-Methode-Schnittstellen zu verwenden. Wenn Sie möchten, dass sie einen richtigen Namen haben, können Sie type aliases verwenden, aber verwenden Sie sie nicht übermäßig. In vielen Fällen ist ein funktionaler Typ zusammen mit guten Methoden-/Variablennamen aussagekräftig genug.

Verwandte Themen