我的代码在那里做什么<t>?

时间:2015-09-22 19:18:52

标签: java rx-java

这是my earlier problem的延续。我的问题已经解决,但我想进一步询问代码,我最好再打开另一个问题,因为我还需要问一些其他问题。所以这是我的可观察的

public static <T> Observable<T> makeObservable(final Callable<T> func) {
        return Observable.create(
                new Observable.OnSubscribe<T>() {
                    @Override
                    public void call(Subscriber<? super T> subscriber) {
                        try {
                            T observed = func.call();
                            if (observed != null) { // to make defaultIfEmpty work
                                subscriber.onNext(observed);
                            }
                            subscriber.onCompleted();
                        } catch (Exception ex) {
                            subscriber.onError(ex);
                        }
                    }
                }).map(new Func1<T, T>() {
            @Override
            public T call(T t) {
                return null;
            }
        });

我不知道T在那做什么?我试图谷歌搜索,但我无法理解它在上面的代码中的作用。官方的java doc说它是'泛型类型是一个泛型类或接口,它是在类型上参数化的'。试图进一步搜索它,我来到this question that confuses me even more

除了需要真正了解T之外,我还需要知道如何使用.map来转换T的内容。从上面的代码来看,这段

.map(new Func1<T, T>() {
    @Override
    public T call(T t) {
        return null;
    }

是我添加的那个,因为我想尝试将T的内容更改为其他内容,也许是另一个对象。我如何实现这一目标?在此之前,这是我对RxJava中的.map函数的理解。

根据http://reactivex.io/RxJava/javadoc/rx/Observable.html#map(rx.functions.Func1)的官方文件,它说,

public final <R> Observable<R> map(Func1<? super T,? extends R> func)
Returns an Observable that applies a specified function to each item emitted by the source Observable and emits the results of these function applications.

func - a function to apply to each item emitted by the Observable

我是否正确解释上面的func定义,第一个参数(super T)应该是'incoming'数据类型,而第二个参数(extends R)是'outgoing'数据类型,或者转换项的数据类型。因为这是我从大多数代码示例中看到的。例如,来自http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/

Observable.just("Hello, world!")
    .map(new Func1<String, Integer>() {
        @Override
        public Integer call(String s) {
            return s.hashCode();
        }
    })

我从上面的代码中理解的是Func1接收字符串并将其传递给call(String s),并返回Integer,如Func1<String, Integer>中所定义。那么我上面的解释总是正确的吗?因为从我的第一个代码开始,我需要将T更改为其他内容,但是当我将.map new Func1的第二个参数更改为T以外的任何其他内容时,Android Studio会给出“不兼容类型”错误。

2 个答案:

答案 0 :(得分:2)

所以你现在正在处理泛型类型。你在这里有一个通用的方法,所以它能够makeObservable处理你在运行时传递给它的任何类型。 <T>将根据传递给方法的参数进行解析。

想要制作一个与Observable打交道的DatemakeObservable(new Callable<Date>() {...}); Observable的{​​{1}}? String

请注意,由于您的代码的可观察流尚未转换输入数据,因此它也会输出makeObservable(new Callable<String>() {...});。另请注意,您的代码无法事先知道它可以调用的方法,因此它将在可能应用的可能转换中受到限制。

其中一个转换(又名Observable<T>)可能是获取map对象的字符串表示。

顺便说一下,是的T函数是正确的,map是输入类型,T是输出类型,因此在代码中应用这样的映射会导致在R的返回类型为makeObservable(用具体类型替换R,你不能在这里生成)。

Observable<R>

答案 1 :(得分:1)

T是您的通用类型。此链接应该有助于解释它:https://docs.oracle.com/javase/tutorial/java/generics/types.html

基本上,类型将在运行时替换为实型,例如String或Object。

如果将Func的返回类型从类型T更改为其他类型,则还必须修改Observable泛型类型。这可以在map的定义中看到:Observable类型R与Func返回类型R一致。