Skip to content

Commit 665f80a

Browse files
Observable.merge: refactor varargs to overloads
ReactiveX#359 Varargs cause compiler warnings
1 parent 781191b commit 665f80a

File tree

3 files changed

+280
-7
lines changed

3 files changed

+280
-7
lines changed

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

Lines changed: 220 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -928,11 +928,11 @@ public static <T> Observable<T> just(T value) {
928928
* Observable, by using the <code>merge</code> method.
929929
*
930930
* @param source
931-
* a list of Observables
931+
* an Iterable of Observables
932932
* @return an Observable that emits items that are the result of flattening the {@code source} list of Observables
933933
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229099(v=vs.103).aspx">MSDN: Observable.Merge</a>
934934
*/
935-
public static <T> Observable<T> merge(List<? extends Observable<? extends T>> source) {
935+
public static <T> Observable<T> merge(Iterable<? extends Observable<? extends T>> source) {
936936
return create(OperationMerge.merge(source));
937937
}
938938

@@ -954,6 +954,28 @@ public static <T> Observable<T> merge(List<? extends Observable<? extends T>> so
954954
public static <T> Observable<T> merge(Observable<? extends Observable<? extends T>> source) {
955955
return create(OperationMerge.merge(source));
956956
}
957+
958+
/**
959+
* Flattens a series of Observables into one Observable, without any transformation.
960+
* <p>
961+
* <img width="640" src="https://raw.github.com/wiki/Netflix/RxJava/images/rx-operators/merge.png">
962+
* <p>
963+
* You can combine items emitted by multiple Observables so that they act like a single
964+
* Observable, by using the {@code merge} method.
965+
*
966+
* @param t1
967+
* an Observable to be merged
968+
* @param t2
969+
* an Observable to be merged
970+
* @return an Observable that emits items that are the result of flattening the items emitted
971+
* by the {@code source} Observables
972+
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229099(v=vs.103).aspx">MSDN: Observable.Merge Method</a>
973+
*/
974+
@SuppressWarnings("unchecked")
975+
// suppress because the types are checked by the method signature before using a vararg
976+
public static <T> Observable<T> merge(Observable<? extends T> t1, Observable<? extends T> t2) {
977+
return create(OperationMerge.merge(t1, t2));
978+
}
957979

958980
/**
959981
* Flattens a series of Observables into one Observable, without any transformation.
@@ -963,14 +985,206 @@ public static <T> Observable<T> merge(Observable<? extends Observable<? extends
963985
* You can combine items emitted by multiple Observables so that they act like a single
964986
* Observable, by using the {@code merge} method.
965987
*
966-
* @param source
967-
* a series of Observables
988+
* @param t1
989+
* an Observable to be merged
990+
* @param t2
991+
* an Observable to be merged
992+
* @param t3
993+
* an Observable to be merged
968994
* @return an Observable that emits items that are the result of flattening the items emitted
969995
* by the {@code source} Observables
970996
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229099(v=vs.103).aspx">MSDN: Observable.Merge Method</a>
971997
*/
972-
public static <T> Observable<T> merge(Observable<? extends T>... source) {
973-
return create(OperationMerge.merge(source));
998+
@SuppressWarnings("unchecked")
999+
// suppress because the types are checked by the method signature before using a vararg
1000+
public static <T> Observable<T> merge(Observable<? extends T> t1, Observable<? extends T> t2, Observable<? extends T> t3) {
1001+
return create(OperationMerge.merge(t1, t2, t3));
1002+
}
1003+
1004+
/**
1005+
* Flattens a series of Observables into one Observable, without any transformation.
1006+
* <p>
1007+
* <img width="640" src="https://raw.github.com/wiki/Netflix/RxJava/images/rx-operators/merge.png">
1008+
* <p>
1009+
* You can combine items emitted by multiple Observables so that they act like a single
1010+
* Observable, by using the {@code merge} method.
1011+
*
1012+
* @param t1
1013+
* an Observable to be merged
1014+
* @param t2
1015+
* an Observable to be merged
1016+
* @param t3
1017+
* an Observable to be merged
1018+
* @param t4
1019+
* an Observable to be merged
1020+
* @return an Observable that emits items that are the result of flattening the items emitted
1021+
* by the {@code source} Observables
1022+
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229099(v=vs.103).aspx">MSDN: Observable.Merge Method</a>
1023+
*/
1024+
@SuppressWarnings("unchecked")
1025+
// suppress because the types are checked by the method signature before using a vararg
1026+
public static <T> Observable<T> merge(Observable<? extends T> t1, Observable<? extends T> t2, Observable<? extends T> t3, Observable<? extends T> t4) {
1027+
return create(OperationMerge.merge(t1, t2, t3, t4));
1028+
}
1029+
1030+
/**
1031+
* Flattens a series of Observables into one Observable, without any transformation.
1032+
* <p>
1033+
* <img width="640" src="https://raw.github.com/wiki/Netflix/RxJava/images/rx-operators/merge.png">
1034+
* <p>
1035+
* You can combine items emitted by multiple Observables so that they act like a single
1036+
* Observable, by using the {@code merge} method.
1037+
*
1038+
* @param t1
1039+
* an Observable to be merged
1040+
* @param t2
1041+
* an Observable to be merged
1042+
* @param t3
1043+
* an Observable to be merged
1044+
* @param t4
1045+
* an Observable to be merged
1046+
* @param t5
1047+
* an Observable to be merged
1048+
* @return an Observable that emits items that are the result of flattening the items emitted
1049+
* by the {@code source} Observables
1050+
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229099(v=vs.103).aspx">MSDN: Observable.Merge Method</a>
1051+
*/
1052+
@SuppressWarnings("unchecked")
1053+
// suppress because the types are checked by the method signature before using a vararg
1054+
public static <T> Observable<T> merge(Observable<? extends T> t1, Observable<? extends T> t2, Observable<? extends T> t3, Observable<? extends T> t4, Observable<? extends T> t5) {
1055+
return create(OperationMerge.merge(t1, t2, t3, t4, t5));
1056+
}
1057+
1058+
/**
1059+
* Flattens a series of Observables into one Observable, without any transformation.
1060+
* <p>
1061+
* <img width="640" src="https://raw.github.com/wiki/Netflix/RxJava/images/rx-operators/merge.png">
1062+
* <p>
1063+
* You can combine items emitted by multiple Observables so that they act like a single
1064+
* Observable, by using the {@code merge} method.
1065+
*
1066+
* @param t1
1067+
* an Observable to be merged
1068+
* @param t2
1069+
* an Observable to be merged
1070+
* @param t3
1071+
* an Observable to be merged
1072+
* @param t4
1073+
* an Observable to be merged
1074+
* @param t5
1075+
* an Observable to be merged
1076+
* @param t6
1077+
* an Observable to be merged
1078+
* @return an Observable that emits items that are the result of flattening the items emitted
1079+
* by the {@code source} Observables
1080+
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229099(v=vs.103).aspx">MSDN: Observable.Merge Method</a>
1081+
*/
1082+
@SuppressWarnings("unchecked")
1083+
// suppress because the types are checked by the method signature before using a vararg
1084+
public static <T> Observable<T> merge(Observable<? extends T> t1, Observable<? extends T> t2, Observable<? extends T> t3, Observable<? extends T> t4, Observable<? extends T> t5, Observable<? extends T> t6) {
1085+
return create(OperationMerge.merge(t1, t2, t3, t4, t5, t6));
1086+
}
1087+
1088+
/**
1089+
* Flattens a series of Observables into one Observable, without any transformation.
1090+
* <p>
1091+
* <img width="640" src="https://raw.github.com/wiki/Netflix/RxJava/images/rx-operators/merge.png">
1092+
* <p>
1093+
* You can combine items emitted by multiple Observables so that they act like a single
1094+
* Observable, by using the {@code merge} method.
1095+
*
1096+
* @param t1
1097+
* an Observable to be merged
1098+
* @param t2
1099+
* an Observable to be merged
1100+
* @param t3
1101+
* an Observable to be merged
1102+
* @param t4
1103+
* an Observable to be merged
1104+
* @param t5
1105+
* an Observable to be merged
1106+
* @param t6
1107+
* an Observable to be merged
1108+
* @param t7
1109+
* an Observable to be merged
1110+
* @return an Observable that emits items that are the result of flattening the items emitted
1111+
* by the {@code source} Observables
1112+
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229099(v=vs.103).aspx">MSDN: Observable.Merge Method</a>
1113+
*/
1114+
@SuppressWarnings("unchecked")
1115+
// suppress because the types are checked by the method signature before using a vararg
1116+
public static <T> Observable<T> merge(Observable<? extends T> t1, Observable<? extends T> t2, Observable<? extends T> t3, Observable<? extends T> t4, Observable<? extends T> t5, Observable<? extends T> t6, Observable<? extends T> t7) {
1117+
return create(OperationMerge.merge(t1, t2, t3, t4, t5, t6, t7));
1118+
}
1119+
1120+
/**
1121+
* Flattens a series of Observables into one Observable, without any transformation.
1122+
* <p>
1123+
* <img width="640" src="https://raw.github.com/wiki/Netflix/RxJava/images/rx-operators/merge.png">
1124+
* <p>
1125+
* You can combine items emitted by multiple Observables so that they act like a single
1126+
* Observable, by using the {@code merge} method.
1127+
*
1128+
* @param t1
1129+
* an Observable to be merged
1130+
* @param t2
1131+
* an Observable to be merged
1132+
* @param t3
1133+
* an Observable to be merged
1134+
* @param t4
1135+
* an Observable to be merged
1136+
* @param t5
1137+
* an Observable to be merged
1138+
* @param t6
1139+
* an Observable to be merged
1140+
* @param t7
1141+
* an Observable to be merged
1142+
* @param t8
1143+
* an Observable to be merged
1144+
* @return an Observable that emits items that are the result of flattening the items emitted
1145+
* by the {@code source} Observables
1146+
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229099(v=vs.103).aspx">MSDN: Observable.Merge Method</a>
1147+
*/
1148+
@SuppressWarnings("unchecked")
1149+
// suppress because the types are checked by the method signature before using a vararg
1150+
public static <T> Observable<T> merge(Observable<? extends T> t1, Observable<? extends T> t2, Observable<? extends T> t3, Observable<? extends T> t4, Observable<? extends T> t5, Observable<? extends T> t6, Observable<? extends T> t7, Observable<? extends T> t8) {
1151+
return create(OperationMerge.merge(t1, t2, t3, t4, t5, t6, t7, t8));
1152+
}
1153+
1154+
/**
1155+
* Flattens a series of Observables into one Observable, without any transformation.
1156+
* <p>
1157+
* <img width="640" src="https://raw.github.com/wiki/Netflix/RxJava/images/rx-operators/merge.png">
1158+
* <p>
1159+
* You can combine items emitted by multiple Observables so that they act like a single
1160+
* Observable, by using the {@code merge} method.
1161+
*
1162+
* @param t1
1163+
* an Observable to be merged
1164+
* @param t2
1165+
* an Observable to be merged
1166+
* @param t3
1167+
* an Observable to be merged
1168+
* @param t4
1169+
* an Observable to be merged
1170+
* @param t5
1171+
* an Observable to be merged
1172+
* @param t6
1173+
* an Observable to be merged
1174+
* @param t7
1175+
* an Observable to be merged
1176+
* @param t8
1177+
* an Observable to be merged
1178+
* @param t9
1179+
* an Observable to be merged
1180+
* @return an Observable that emits items that are the result of flattening the items emitted
1181+
* by the {@code source} Observables
1182+
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229099(v=vs.103).aspx">MSDN: Observable.Merge Method</a>
1183+
*/
1184+
@SuppressWarnings("unchecked")
1185+
// suppress because the types are checked by the method signature before using a vararg
1186+
public static <T> Observable<T> merge(Observable<? extends T> t1, Observable<? extends T> t2, Observable<? extends T> t3, Observable<? extends T> t4, Observable<? extends T> t5, Observable<? extends T> t6, Observable<? extends T> t7, Observable<? extends T> t8, Observable<? extends T> t9) {
1187+
return create(OperationMerge.merge(t1, t2, t3, t4, t5, t6, t7, t8, t9));
9741188
}
9751189

9761190
/**

rxjava-core/src/main/java/rx/operators/OperationMerge.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public static <T> OnSubscribeFunc<T> merge(final Observable<? extends T>... sequ
7070
return merge(Arrays.asList(sequences));
7171
}
7272

73-
public static <T> OnSubscribeFunc<T> merge(final List<? extends Observable<? extends T>> sequences) {
73+
public static <T> OnSubscribeFunc<T> merge(final Iterable<? extends Observable<? extends T>> sequences) {
7474
return merge(Observable.create(new OnSubscribeFunc<Observable<? extends T>>() {
7575

7676
private volatile boolean unsubscribed = false;

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

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,65 @@ public Subscription onSubscribe(Observer<? super Movie> o) {
130130
assertTrue(values.get(2) instanceof Media);
131131
assertTrue(values.get(3) instanceof HorrorMovie);
132132
}
133+
134+
135+
@Test
136+
public void testMergeCovariance() {
137+
Observable<Media> o1 = Observable.<Media> from(new HorrorMovie(), new Movie());
138+
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
139+
140+
Observable<Observable<Media>> os = Observable.from(o1, o2);
141+
142+
List<Media> values = Observable.merge(os).toList().toBlockingObservable().single();
143+
}
144+
145+
@Test
146+
public void testMergeCovariance2() {
147+
Observable<Media> o1 = Observable.from(new HorrorMovie(), new Movie(), new Media());
148+
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
149+
150+
Observable<Observable<Media>> os = Observable.from(o1, o2);
151+
152+
List<Media> values = Observable.merge(os).toList().toBlockingObservable().single();
153+
}
154+
155+
@Test
156+
public void testMergeCovariance3() {
157+
Observable<Movie> o1 = Observable.from(new HorrorMovie(), new Movie());
158+
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
159+
160+
List<Media> values = Observable.merge(o1, o2).toList().toBlockingObservable().single();
161+
162+
assertTrue(values.get(0) instanceof HorrorMovie);
163+
assertTrue(values.get(1) instanceof Movie);
164+
assertTrue(values.get(2) instanceof Media);
165+
assertTrue(values.get(3) instanceof HorrorMovie);
166+
}
167+
168+
@Test
169+
public void testMergeCovariance4() {
170+
171+
Observable<Movie> o1 = Observable.create(new OnSubscribeFunc<Movie>() {
172+
173+
@Override
174+
public Subscription onSubscribe(Observer<? super Movie> o) {
175+
o.onNext(new HorrorMovie());
176+
o.onNext(new Movie());
177+
// o.onNext(new Media()); // correctly doesn't compile
178+
o.onCompleted();
179+
return Subscriptions.empty();
180+
}
181+
});
182+
183+
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
184+
185+
List<Media> values = Observable.merge(o1, o2).toList().toBlockingObservable().single();
186+
187+
assertTrue(values.get(0) instanceof HorrorMovie);
188+
assertTrue(values.get(1) instanceof Movie);
189+
assertTrue(values.get(2) instanceof Media);
190+
assertTrue(values.get(3) instanceof HorrorMovie);
191+
}
133192

134193
Func2<Media, Rating, ExtendedResult> combine = new Func2<Media, Rating, ExtendedResult>() {
135194
@Override

0 commit comments

Comments
 (0)