【问题标题】:Why doesn't the return type satisfy the method signature?为什么返回类型不满足方法签名?
【发布时间】:2016-12-23 12:34:53
【问题描述】:

为什么返回类型不满足下面方法中的方法签名?

protected Observable<List<? extends Person>> getLoadPersonsObservable() {
    return StudentsProvider.getStudentsProvider().getStudents().subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());
}

observeOn() 方法返回以下内容:

Observable<List<Student>>

这里是学生类:

public class Student extends Person {
    public Student(String name, String id, boolean approved) {
       super(name, id, approved);
    }
}

错误:

目前,getStudents() 是一个存根方法,模拟网络调用:

 @Override
public Observable<List<Student>> getStudents() {

    final Observable<List<Student>> fetchStudents = Observable.create(new Observable.OnSubscribe<List<Student>>() {
        @Override
        public void call(Subscriber<? super List<Student>> subscriber) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            List <Student> stubList = new ArrayList<>();

            stubList.add(new Student("Freddie Mercury", "1", true));
            stubList.add(new Student("Jimmy Hendrix", "2", true));

            subscriber.onNext(stubList);

            subscriber.onCompleted();
        }
    });
    return fetchStudents;
}

提前致谢! - 伴侣

【问题讨论】:

  • 你能展示StudentsProvider.getStudentsProvider().getStudents()的实现吗
  • 以任何类型的 Observable&lt;?&gt; 这样的 observable 形式返回。
  • 尝试用Observable&lt;? extends List&lt;? extends Person&gt;&gt;替换Observable&lt;List&lt;? extends Person&gt;&gt;

标签: java android wildcard rx-java rx-android


【解决方案1】:

首先为你的观察者创建一个自定义类

private class MyObservable<T extends Person> extends Observable<List<T>>{

}

然后在您的活动中,添加此方法

private MyObservable<Student> getData(){
        return new MyObservable<>();
}

这只是一个示例,说明如何实现您正在尝试的目标。

附:这可能不是最终解决方案,但它肯定会帮助您删除解决方案中的静态实现

【讨论】:

    【解决方案2】:

    最终将 Person 子类型引用传递给调用者类的父类并更改抽象方法签名,如下所示:

     abstract protected Observable<List<P>> getLoadPersonsObservable();
    

    现在方法的实现可以是这样的:

    @Override
    protected Observable<List<Student>> getLoadPersonsObservable() {
        return StudentsProvider.getStudentsProvider().getStudents().subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
    }
    

    瞧,没有错误。谢谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 2021-03-16
      • 2020-01-17
      • 1970-01-01
      • 2014-10-24
      相关资源
      最近更新 更多