Skip to content

Commit 6c8ca2f

Browse files
Merge pull request #1569 from benjchristensen/compose-transformer-variance
Compose/Transform Covariance
2 parents e1943b9 + 26ca287 commit 6c8ca2f

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

rxjava-core/src/main/java/rx/Observable.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ public void call(Subscriber<? super R> o) {
204204
* @see <a href="https://github.com/Netflix/RxJava/wiki/Implementing-Your-Own-Operators">RxJava wiki: Implementing Your Own Operators</a>
205205
* @since 0.20
206206
*/
207-
public <R> Observable<R> compose(Transformer<T, R> transformer) {
207+
public <R> Observable<? extends R> compose(Transformer<? super T, ? extends R> transformer) {
208208
return transformer.call(this);
209209
}
210210

@@ -213,7 +213,7 @@ public <R> Observable<R> compose(Transformer<T, R> transformer) {
213213
* @warn more complete description needed
214214
* @since 0.20
215215
*/
216-
public static interface Transformer<T, R> extends Func1<Observable<T>, Observable<R>> {
216+
public static interface Transformer<T, R> extends Func1<Observable<? extends T>, Observable<? extends R>> {
217217
// cover for generics insanity
218218
}
219219

rxjava-core/src/test/java/rx/CovarianceTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import org.junit.Test;
2121

22+
import rx.Observable.Transformer;
2223
import rx.functions.Func2;
2324

2425
/**
@@ -57,6 +58,32 @@ public Integer call(Media t1, Media t2) {
5758
o2.toSortedList(SORT_FUNCTION);
5859
}
5960

61+
62+
@Test
63+
public void testCovarianceOfCompose() {
64+
Observable<HorrorMovie> movie = Observable.<HorrorMovie> from(new HorrorMovie());
65+
movie.compose(new Transformer<Movie, Movie>() {
66+
67+
@Override
68+
public Observable<? extends Movie> call(Observable<? extends Movie> t1) {
69+
return Observable.from(new Movie());
70+
}
71+
72+
});
73+
}
74+
75+
@Test
76+
public void testCovarianceOfCompose2() {
77+
Observable<Movie> movie = Observable.<Movie> from(new HorrorMovie());
78+
movie.compose(new Transformer<Movie, Movie>() {
79+
@Override
80+
public Observable<? extends Movie> call(Observable<? extends Movie> t1) {
81+
return Observable.from(new HorrorMovie());
82+
}
83+
});
84+
}
85+
86+
6087
/*
6188
* Most tests are moved into their applicable classes such as [Operator]Tests.java
6289
*/

rxjava-core/src/test/java/rx/ObservableTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,9 +1108,9 @@ public void testCompose() {
11081108
Observable.from(1, 2, 3).compose(new Transformer<Integer, String>() {
11091109

11101110
@Override
1111-
public Observable<String> call(Observable<Integer> t1) {
1111+
public Observable<? extends String> call(Observable<? extends Integer> t1) {
11121112
return t1.map(new Func1<Integer, String>() {
1113-
1113+
11141114
@Override
11151115
public String call(Integer t1) {
11161116
return String.valueOf(t1);

0 commit comments

Comments
 (0)