为什么返回类型不满足方法签名?

时间:2016-12-23 12:34:54

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

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

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);
    }
}

错误: enter image description here

目前,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;
}

提前致谢! - 伴侣

2 个答案:

答案 0 :(得分:0)

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

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

现在该方法的实现可能如下所示:

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

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

答案 1 :(得分:0)

首先为Observer创建一个自定义类

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

}

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

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

这只是你如何实现目标的一个例子。

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