diff --git a/rxjava-core/src/main/java/rx/Observable.java b/rxjava-core/src/main/java/rx/Observable.java
index ce2b764117..9c8a99b121 100644
--- a/rxjava-core/src/main/java/rx/Observable.java
+++ b/rxjava-core/src/main/java/rx/Observable.java
@@ -204,7 +204,7 @@ public void call(Subscriber super R> o) {
* @see RxJava wiki: Implementing Your Own Operators
* @since 0.20
*/
- public Observable compose(Transformer transformer) {
+ public Observable extends R> compose(Transformer super T, ? extends R> transformer) {
return transformer.call(this);
}
@@ -213,7 +213,7 @@ public Observable compose(Transformer transformer) {
* @warn more complete description needed
* @since 0.20
*/
- public static interface Transformer extends Func1, Observable> {
+ public static interface Transformer extends Func1, Observable extends R>> {
// cover for generics insanity
}
diff --git a/rxjava-core/src/test/java/rx/CovarianceTest.java b/rxjava-core/src/test/java/rx/CovarianceTest.java
index adf3a8c9b8..5f5a7e2f29 100644
--- a/rxjava-core/src/test/java/rx/CovarianceTest.java
+++ b/rxjava-core/src/test/java/rx/CovarianceTest.java
@@ -19,6 +19,7 @@
import org.junit.Test;
+import rx.Observable.Transformer;
import rx.functions.Func2;
/**
@@ -57,6 +58,32 @@ public Integer call(Media t1, Media t2) {
o2.toSortedList(SORT_FUNCTION);
}
+
+ @Test
+ public void testCovarianceOfCompose() {
+ Observable movie = Observable. from(new HorrorMovie());
+ movie.compose(new Transformer() {
+
+ @Override
+ public Observable extends Movie> call(Observable extends Movie> t1) {
+ return Observable.from(new Movie());
+ }
+
+ });
+ }
+
+ @Test
+ public void testCovarianceOfCompose2() {
+ Observable movie = Observable. from(new HorrorMovie());
+ movie.compose(new Transformer() {
+ @Override
+ public Observable extends Movie> call(Observable extends Movie> t1) {
+ return Observable.from(new HorrorMovie());
+ }
+ });
+ }
+
+
/*
* Most tests are moved into their applicable classes such as [Operator]Tests.java
*/
diff --git a/rxjava-core/src/test/java/rx/ObservableTests.java b/rxjava-core/src/test/java/rx/ObservableTests.java
index cdee0440a1..91e1113cb3 100644
--- a/rxjava-core/src/test/java/rx/ObservableTests.java
+++ b/rxjava-core/src/test/java/rx/ObservableTests.java
@@ -1108,9 +1108,9 @@ public void testCompose() {
Observable.from(1, 2, 3).compose(new Transformer() {
@Override
- public Observable call(Observable t1) {
+ public Observable extends String> call(Observable extends Integer> t1) {
return t1.map(new Func1() {
-
+
@Override
public String call(Integer t1) {
return String.valueOf(t1);