当前位置: 首页 > 知识库问答 >
问题:

强制转换Observable.Subscribe时出错

连成益
2023-03-14

如下面的代码所示,我发现了一个关于下面一行的错误,因为转换不正确

.subscribe((Consumer<? super List<String>>)getAnimalsObserver());

请让我知道如何解决这个问题。

注:

I am using the folloing rx versions
compile 'io.reactivex.rxjava2:rxandroid:2.0.2'
compile 'io.reactivex.rxjava2:rxjava:2.0.5'

代码:

import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;

公共类MainActivity扩展AppCompatActivity{

getAnimalsObservable()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe((Consumer<? super List<String>>)getAnimalsObserver());



 private Observer<String> getAnimalsObserver() {
    return new Observer<String>() {

        @Override
        public void onSubscribe(Disposable d) {
            Log.i(TAG, "onSubscribe->d: " + d);
        }

        @Override
        public void onNext(String s) {
            Log.i(TAG, "onNext->s: " + s);
        }

        @Override
        public void onError(Throwable e) {
            Log.i(TAG, "onError->e: " + e);
        }

        @Override
        public void onComplete() {
            Log.i(TAG, "onComplete");
        }
    };
}  

logcat:

Caused by: java.lang.ClassCastException: 
com.example.pc_a.myapplication.MainActivity$1 cannot be cast to 
io.reactivex.functions.Consumer
at com.example.pc_a.myapplication.MainActivity.onCreate(MainActivity.java:38)
at android.app.Activity.performCreate(Activity.java:6288)
at 
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
t android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2642)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2754) 

共有1个答案

公良俊楚
2023-03-14

首先,您不需要强制转换为consumer。其次,您应该如下修改观察者以使其工作(observer已经可以在subscribe中使用)。我把它简化了一点,让它更整洁:

private Observable<List<String>> getAnimalsObservable() {
    return Observable.fromArray(Arrays.asList(
        new String[]{
            "Ant", "Ape",
            "Bat", "Bee", "Bear", "Butterfly",
            "Cat", "Crab", "Cod",
            "Dog", "Dove",
            "Fox", "Frog"
        }
    ));
}

private Observer<List<String>> getObserver() {
    return new Observer<List<String>>() {
        @Override
        public void onSubscribe(Disposable d) {
            //your logic here
        }

        @Override
        public void onNext(List<String> values) {
            //your logic here
            for (String value : values) {
                System.out.print(value + " ");
            }
        }

        @Override
        public void onError(Throwable e) {
            //your logic here
        }

        @Override
        public void onComplete() {
            //your logic here
        }
    };
}

@Test
public void test() {
    // here you can add your observeOn and subscribeOn but they're not important for the test
    getAnimalsObservable()
        .subscribe(getObserver());
}

输出:

蚂蚁猿蝙蝠蜜蜂熊蝴蝶猫蟹鳕鱼狗鸽子狐蛙

 类似资料:
  • 隐含的强制转换 隐含的 强制转换是指这样的类型转换:它们是隐藏的,由于其他的动作隐含地发生的不明显的副作用。换句话说,任何(对你)不明显的类型转换都是 隐含的强制转换。 虽然 明确的 强制转换的目的很明白,但是这可能 太过 明显 —— 隐含的 强制转换拥有相反的目的:使代码更难理解。 从表面上来看,我相信这就是许多关于强制转换的愤怒的源头。绝大多数关于“JavaScript强制转换”的抱怨实际上都

  • 明确的强制转换 明确的 强制转换指的是明显且明确的类型转换。对于大多数开发者来说,有很多类型转换的用法可以清楚地归类于这种 明确的 强制转换。 我们在这里的目标是,在我们的代码中指明一些模式,在这些模式中我们可以清楚明白地将一个值从一种类型转换至另一种类型,以确保不给未来将读到这段代码的开发者留下任何坑。我们越明确,后来的人就越容易读懂我们的代码,也不必费太多的力气去理解我们的意图。 关于 明确的

  • 问题内容: 在SQL Server 2005中,为什么这样做: 展示: 1900年1月1日上午12:00 我会以为应该的吗? 问题答案: 空字符串将强制转换为,之后将强制转换为时代日期。 与不同,区分和一个空字符串。

  • 强制类型转换 隐式类型转换:隐式类型转换又称为自动类型转换,隐式类型转换可分为三种:算术转换、赋值转换和输出转换。 显式类型转换:显式类型转换又称为强制类型转换,指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,这种类型转换可能会造成数据的精度丢失。 数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。 转换的方法有两种: 自动转换(隐式转换):遵循一定的规则

  • 我在这里遇到了一个关于带列表的泛型有界类型的小问题。请帮帮我! 有什么方法可以克服这个问题,或者我可以安全地压制警告吗?

  • 转换值 将一个值从一个类型明确地转换到另一个类型通常称为“类型转换(type casting)”,当这个操作隐含地完成时称为“强制转换(coercion)”(根据一个值如何被使用的规则来强制它变换类型)。 注意: 这可能不明显,但是 JavaScript 强制转换总是得到基本标量值的一种,比如 string、number、或 boolean。没有强制转换可以得到像 object 和 functio