上一篇讲了创建型操作符,里面需要传个一个泛型假设为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返回的数据转换到了下游