2016-07-29 8 views
1

Ich versuche, eine RxJava-Bibliothek zu portieren und Erweiterungsfunktionen in Kotlin zu nutzen."Super" Generika in Kotlin Funktionstypen auszudrücken?

fun <T,R: MutableCollection<T>> Observable<T>.collectWhile(factory: (() -> R), condition: (R,T) -> Boolean) = 
     compose(Transformers.collectWhile(factory,condition)) 

Die Transformers.collectWhile() ist in Java geschrieben und hat diese Unterschrift:

public static <T, R extends Collection<T>> Transformer<T, R> collectWhile(final Func0<R> factory, 
      final Action2<? super R, ? super T> collect) 

Allerdings bin ich mit Abbildung des collect Argument ein Problem bekommen, und ich bin bei Generika nicht gut. Wie kann ich super mit einem Funktionstyp ausdrücken?

UPDATE

dumme Fehler meinerseits. Ich hätte nicht spät in der Nacht auf SO schreiben dürfen.

Ich war eigentlich Targeting dieses

public static <T, R extends Iterable<?>> Transformer<T, R> collectWhile(final Func0<R> factory, 
     final Action2<? super R, ? super T> collect, final Func2<? super R, ? super T, Boolean> condition) 

Und das ist, was ich getan haben sollte.

fun <T,R: MutableCollection<T>> Observable<T>.collectWhile(factory: (() -> R), action: (R,T) -> Unit, condition: (R,T) -> Boolean) = 
    compose(Transformers.collectWhile(factory,action,condition)) 
+0

fügen Sie bitte die Fehlermeldung Sie erhalten – voddan

Antwort

3

Java Wildcard Typ ? super T entspricht in Tuse-site type projection in Kotlin, so dass die entsprechende Art von collect Parameter würde Action2<in R, in T> sein.

Diese Art ist in etwa äquivalent (oder mehr ist speziell geeignet für SAM-conversion) zu (R, T) -> Unit funktionalem Typ in Kotlin, weil (R, T) -> Unit ein Synonym für Typen ist Function2<R, T, Unit> und letztere ist äquivalent zu Function2<in R, in T, out Unit> aufgrund der declaration-site variance des Typparameters Function2.

Sie können keine Funktion vom Typ (R, T) -> Boolean als Argument an collect übergeben, wobei (R, T) -> Unit erwartet wird.

Entweder den Typ collect oder den Typ condition Parameter ändern.

+0

Oh Mann jetzt fühle ich mich dumm. Es war spät in der Nacht, als ich das tat. Ich werde meine Antwort aktualisieren. – tmn