不兼容类型,已找到列表<;捕获<;?扩展模型>&燃气轮机;仅在Java8中

不兼容类型,已找到列表<;捕获<;?扩展模型>&燃气轮机;仅在Java8中,java,android,android-studio,java-8,rx-java2,Java,Android,Android Studio,Java 8,Rx Java2,我目前正在审查对Android应用程序的更改,该应用程序升级为使用Java8 在检查过程中,我注意到以下代码被划为错误: List<MappableTask> tasks = Observable.fromIterable(taskMapHoldingPresenter.getMappableTasks()) .filter(isMappableTask) .toList() .blockingGet(); 请注意,MappableT

我目前正在审查对Android应用程序的更改,该应用程序升级为使用Java8

在检查过程中,我注意到以下代码被划为错误:

List<MappableTask> tasks = Observable.fromIterable(taskMapHoldingPresenter.getMappableTasks())
        .filter(isMappableTask)
        .toList()
        .blockingGet();
请注意,
MappableTask
是由各种模型类实现的接口

怎么会是
List List=taskMapHoldingPresenter.getMappableTasks()无效吗


此代码按预期生成。如上所述,在升级应用程序以使用Java8之前,没有显示此错误。为什么会出现此问题?

您的接口声明允许
getmappabletask
方法返回任何
MappableTask
子类的列表。假设
MappableAsyncTask
扩展
MappableTask
您的接口理论上可以返回
列表

这种限制的存在是有原因的。如果可以进行此分配,您可以轻松地将
MappableTask
实例添加到
任务
列表中,从而打破实际的列表实现契约。请记住,
getMappableTasks
方法返回的实际列表只能包含
mappableask
的实例

List<MappableTask> tasks = asyncPresenter.getMappableTasks(); // wrong
tasks.add(new MappableTask()); // wrong
List tasks=asyncPresenter.getMappableTasks();//错误的
tasks.add(新的MappableTask());//错误的

更多信息。

您的接口声明允许
getMapableTasks
方法返回任何
MapableTask
子类的列表。假设
MappableAsyncTask
扩展
MappableTask
您的接口理论上可以返回
列表

这种限制的存在是有原因的。如果可以进行此分配,您可以轻松地将
MappableTask
实例添加到
任务
列表中,从而打破实际的列表实现契约。请记住,
getMappableTasks
方法返回的实际列表只能包含
mappableask
的实例

List<MappableTask> tasks = asyncPresenter.getMappableTasks(); // wrong
tasks.add(new MappableTask()); // wrong
List tasks=asyncPresenter.getMappableTasks();//错误的
tasks.add(新的MappableTask());//错误的
更多信息。

您可以使用

List<MappableTask> tasks
    = Observable.<MappableTask>fromIterable(taskMapHoldingPresenter.getMappableTasks())
        .filter(isMappableTask)
        .toList()
        .blockingGet();
列出任务
=可观察的.fromIterable(taskMapHoldingPresenter.getMappableTasks())
.filter(IsAppableTask)
托利斯先生()
.blockingGet();
正如正确解释的那样,您不能简单地分配一个可以使用的
列表

List<MappableTask> tasks
    = Observable.<MappableTask>fromIterable(taskMapHoldingPresenter.getMappableTasks())
        .filter(isMappableTask)
        .toList()
        .blockingGet();
列出任务
=可观察的.fromIterable(taskMapHoldingPresenter.getMappableTasks())
.filter(IsAppableTask)
托利斯先生()
.blockingGet();

正如正确解释的那样,您不能简单地分配一个
ListShort答案:假设B扩展了a,列表不是ListShort答案的子类型:假设B扩展了a,列表不是ListShort答案的子类型您可以通过使用
ListTasks=Collections.unmodifiableList(asyncPresenter.GetMapableTasks())防止错误的插入,这也允许类型转换。您可以通过使用
List tasks=Collections.unmodifiableList(asyncPresenter.getMappableTasks())防止错误插入,然后还允许类型转换。
List<MappableTask> tasks = asyncPresenter.getMappableTasks(); // wrong
tasks.add(new MappableTask()); // wrong
List<MappableTask> tasks
    = Observable.<MappableTask>fromIterable(taskMapHoldingPresenter.getMappableTasks())
        .filter(isMappableTask)
        .toList()
        .blockingGet();
List<MappableTask> list = taskMapHoldingPresenter.getMappableTasks();
List<MappableTask> list // just a lightweight wrapper
    = Collections.unmodifiableList(taskMapHoldingPresenter.getMappableTasks());
List<MappableTask> list = new ArrayList<>(taskMapHoldingPresenter.getMappableTasks());