上一篇講了創建型操作符,裏面需要傳個一個泛型假設爲String,那麼下游接收的泛型也是String
map操作符的作用就是,假設我下游需要接收的是一個Bitmap那這個時候就需要類型來轉換.
下來來分析下Rxjava是如果做到泛型轉換的,先來看來.map的代碼
public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) {
ObjectHelper.requireNonNull(mapper, "mapper is null");
return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper));
}
.map的時候返回的是一個帶R泛型的Observable<R>被觀察者 ,再傳入了一個Function參數,Function裏有二個泛型? super T, ? extends R
這裏簡單介紹下泛型裏的super 和extends
<? extends R > 控制其上限,最高只能是R 這裏傳Object就不行,只能是R or R的子類
<? extends R > 可讀不可寫,
<? super T > 控制其下限,最低只能是T, 這樣傳Object也是可以的 只能是T或者是他的父類
<? super T > 可與,不完全可讀
Function是一個接口,裏面就一個方法
public interface Function<T, R> {
@NonNull
R apply(@NonNull T t) throws Exception;
}
所以我們執行map操作符的時候會重寫這個apply方法,也就是將原來的T泛型轉換爲就換後的R泛型,
接着上面分析,在map操作符裏面返回的是一個ObservableMap,ObservableMap它也是一個被觀察者來看看他的繼承關係
超父類: Observable<U> 泛型爲U
父類: AbstractObservableWithUpstream<T, U> 泛型爲T 和U ,把泛型U傳給超父類
自己: ObservableMap<T, U> 泛型爲T 和 U, T和 U直接傳給父類
有了上面這層關係,當我們通過create的時候傳的的泛型爲 T,假設我們傳入的是String 也就是說被觀察的泛型爲String,
在map操作符的方法之上有個泛型R 假設我們把這個R傳入的是Bitmap這個時候我們創建ObservableMap的時候就把String,Bitmap當作參數傳過來
new ObservableMap<String, Bitmap>(this, mapper)
this就是Observable<String>,
mapper就是Function<? super String, ? extends Bitmap> mapper
上面可以看出ObservableMap的泛型爲<String, Bitmap>,給父類的也是AbstractObservableWithUpstream<String, Bitmap>,再給超父類也就是Observable的泛型就是<Bitmap>,成功實行的泛型的轉換.
因爲ObservableMap的超父類是Observable,所以在執行subscribe的時候也是執行他的subscribeActual抽象方法,這個方法是由其子類也實現也就是ObservableMap
public void subscribeActual(Observer<? super U> t) {
source.subscribe(new MapObserver<T, U>(t, function));
}
上面的這個source就是通過創建操作符創建的Observable也就是ObservableCreate
source.subscribe(new MapObserver<T, U>(t, function));就是執行
ObservableCreate.subscribe(..)方法,而這個MapObserver他實現了Observer接口,並執有了原始觀察者Observer的引用,
在MapObserver的onNext方法中,
public void onNext(T t) {
if (done) {
return;
}
if (sourceMode != NONE) {
actual.onNext(null);
return;
}
U v;
try {
v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
} catch (Throwable ex) {
fail(ex);
return;
}
actual.onNext(v);
}
最終就是通過Function裏面的實現方法apply返回的數據轉換到了下游