diff --git a/src/main/java/io/reactivex/Flowable.java b/src/main/java/io/reactivex/Flowable.java index b952c7b5a7..c8119521ec 100644 --- a/src/main/java/io/reactivex/Flowable.java +++ b/src/main/java/io/reactivex/Flowable.java @@ -6483,11 +6483,12 @@ public final Single collectInto(final U initialItem, BiConsumerRxJava wiki: Implementing Your Own Operators */ + @SuppressWarnings("unchecked") @CheckReturnValue @BackpressureSupport(BackpressureKind.PASS_THROUGH) @SchedulerSupport(SchedulerSupport.NONE) - public final Flowable compose(FlowableTransformer composer) { - return fromPublisher(composer.apply(this)); + public final Flowable compose(FlowableTransformer composer) { + return fromPublisher(((FlowableTransformer) composer).apply(this)); } /** diff --git a/src/main/java/io/reactivex/Maybe.java b/src/main/java/io/reactivex/Maybe.java index 7d09ea658a..b2423f26e1 100644 --- a/src/main/java/io/reactivex/Maybe.java +++ b/src/main/java/io/reactivex/Maybe.java @@ -2074,10 +2074,11 @@ public final Maybe cast(final Class clazz) { * @return a Maybe, transformed by the transformer function * @see RxJava wiki: Implementing Your Own Operators */ + @SuppressWarnings("unchecked") @CheckReturnValue @SchedulerSupport(SchedulerSupport.NONE) - public final Maybe compose(MaybeTransformer transformer) { - return wrap(transformer.apply(this)); + public final Maybe compose(MaybeTransformer transformer) { + return wrap(((MaybeTransformer) transformer).apply(this)); } /** diff --git a/src/main/java/io/reactivex/Observable.java b/src/main/java/io/reactivex/Observable.java index 57eed27352..d0247d0d62 100644 --- a/src/main/java/io/reactivex/Observable.java +++ b/src/main/java/io/reactivex/Observable.java @@ -5722,10 +5722,11 @@ public final Single collectInto(final U initialValue, BiConsumerRxJava wiki: Implementing Your Own Operators */ + @SuppressWarnings("unchecked") @CheckReturnValue @SchedulerSupport(SchedulerSupport.NONE) - public final Observable compose(ObservableTransformer composer) { - return wrap(composer.apply(this)); + public final Observable compose(ObservableTransformer composer) { + return wrap(((ObservableTransformer) composer).apply(this)); } /** diff --git a/src/main/java/io/reactivex/Single.java b/src/main/java/io/reactivex/Single.java index 0f983d1384..1d275e3d59 100644 --- a/src/main/java/io/reactivex/Single.java +++ b/src/main/java/io/reactivex/Single.java @@ -1540,10 +1540,11 @@ public final Single hide() { * @return the source Single, transformed by the transformer function * @see RxJava wiki: Implementing Your Own Operators */ + @SuppressWarnings("unchecked") @CheckReturnValue @SchedulerSupport(SchedulerSupport.NONE) - public final Single compose(SingleTransformer transformer) { - return wrap(transformer.apply(this)); + public final Single compose(SingleTransformer transformer) { + return wrap(((SingleTransformer) transformer).apply(this)); } /** diff --git a/src/test/java/io/reactivex/TransformerTest.java b/src/test/java/io/reactivex/TransformerTest.java index f76b2cef52..14834867e5 100644 --- a/src/test/java/io/reactivex/TransformerTest.java +++ b/src/test/java/io/reactivex/TransformerTest.java @@ -13,12 +13,11 @@ package io.reactivex; -import static org.junit.Assert.*; - +import io.reactivex.exceptions.TestException; import org.junit.Test; import org.reactivestreams.Publisher; -import io.reactivex.exceptions.TestException; +import static org.junit.Assert.*; public class TransformerTest { @@ -83,7 +82,7 @@ public Maybe apply(Maybe v) { } @Test - public void completabeTransformerThrows() { + public void completableTransformerThrows() { try { Completable.complete().compose(new CompletableTransformer() { @Override @@ -96,4 +95,73 @@ public Completable apply(Completable v) { assertEquals("Forced failure", ex.getMessage()); } } + + // Test demos for signature generics in compose() methods. Just needs to compile. + + @Test + public void observableGenericsSignatureTest() { + A a = new A() { }; + + Observable.just(a).compose(TransformerTest.testObservableTransformerCreator()); + } + + @Test + public void singleGenericsSignatureTest() { + A a = new A() { }; + + Single.just(a).compose(TransformerTest.testSingleTransformerCreator()); + } + + @Test + public void maybeGenericsSignatureTest() { + A a = new A() { }; + + Maybe.just(a).compose(TransformerTest.testMaybeTransformerCreator()); + } + + @Test + public void flowableGenericsSignatureTest() { + A a = new A() { }; + + Flowable.just(a).compose(TransformerTest.testFlowableTransformerCreator()); + } + + interface A {} + interface B {} + + private static ObservableTransformer, B> testObservableTransformerCreator() { + return new ObservableTransformer, B>() { + @Override + public ObservableSource> apply(Observable> a) { + return Observable.empty(); + } + }; + } + + private static SingleTransformer, B> testSingleTransformerCreator() { + return new SingleTransformer, B>() { + @Override + public SingleSource> apply(Single> a) { + return Single.never(); + } + }; + } + + private static MaybeTransformer, B> testMaybeTransformerCreator() { + return new MaybeTransformer, B>() { + @Override + public MaybeSource> apply(Maybe> a) { + return Maybe.empty(); + } + }; + } + + private static FlowableTransformer, B> testFlowableTransformerCreator() { + return new FlowableTransformer, B>() { + @Override + public Publisher> apply(Flowable> a) { + return Flowable.empty(); + } + }; + } }