java - 不兼容的类型,发现 List<capture<?仅在 Java 8 中扩展模型>>

标签 java android android-studio java-8 rx-java2

我目前正在审查对 Android 应用程序的更改,将应用程序升级为使用 Java 8。

在审查过程中,我注意到以下代码被加下划线表示为错误:

List<MappableTask> tasks = Observable.fromIterable(taskMapHoldingPresenter.getMappableTasks())
        .filter(isMappableTask)
        .toList()
        .blockingGet();

现在显示以下内容:

Incompatible Types.
Required: List<MappableTask>
Found: List<capture<? extends MappableTask>>

getMappableTasks()方法在接口(interface)中定义如下:

List<? extends MappableTask> getMappableTasks();

请注意 MappableTask是各种模型类实现的接口(interface)。

List<MappableTask> list = taskMapHoldingPresenter.getMappableTasks(); 是怎么回事?无效?

此代码按预期构建。如前所述,在将应用程序升级为使用 Java 8 之前未显示此错误。为什么会出现此问题?

最佳答案

您的接口(interface)声明允许 getMappableTasks返回任何 MappableTask 列表的方法子类。假设 MappableAsyncTask延伸MappableTask你的界面理论上可以返回List<MappableAsyncTask> .

class MappableAsyncTask extends MappableTask {
}

class AsyncPresenter implements TaskMapHoldingPresenter {
    @Override
    public List<? extends MappableTask> getMappableTasks() {
        List<MappableAsyncTask> result = new ArrayList<>();
        result.add(new MappableAsyncTask());
        return result;
    }
}

但是List<MappableAsyncTask>不是 List<MappableTask> 的子类, 所以你不能分配 getMappableTasks结果为 tasks变量。

List<MappableTask> tasks = asyncPresenter.getMappableTasks(); // wrong

此限制的存在是有原因的。如果可以进行此分配,您可以轻松添加 MappableTask实例到 tasks列表,打破实际列表执行契约(Contract)。请记住 getMappableTasks 返回的实际列表方法只能包含 MappableAsyncTask 的实例.

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

更多信息 here .

关于java - 不兼容的类型,发现 List<capture<?仅在 Java 8 中扩展模型>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48177208/

相关文章:

java - 在 Android 应用程序中看不到导入的依赖模块类 LibGDX

java - Android Studio 中缺少存储库

java - 不可能的 Java 方法调用行为

java - 如何在我的 Android 应用程序项目中包含新的 .java 文件?

java - 是否有不被视为空白的不可见字符?

java - 17 版在分析时“未找到依赖关系”

android - Android的锁屏来源

java - 安卓:Thread.sleep( ) 不工作

android - 在android studio中创建dependencies.gradle

android - 如何测试移动应用程序的性能