Java类层次结构中与泛型不兼容的空性约束

克里斯托夫·康宁

我正在将我的Java代码库从java7迁移到java8的项目。在此过程中,我还从javax.annotation @ Nullable,@ NonNull和@ParametersAreNotNullByDefault注释切换到org.eclipse.jdt注释,以进行Eclipse中的空分析(Mars版本4.5.0:内部版本号:20150621-1200)。在执行此操作时,我偶然发现了由于某种我无法解释的原因而无法编译的情况(由于对基于注释的null检查进行了严格的日食设置)。我不是在寻找一种方法来编译我的代码,而是更多地了解为什么会发生错误。

我有一个包下面的类指定使用默认的非NULL的含量@NonNullByDefaultpackage-info.java

我有一个由抽象类实现的接口,该接口又由一个具体类扩展,如下所示:

public interface SimulationComponent {

    <T extends SimulationComponent> List<T> getCorrectSimulationSubComponents();

    List<? extends SimulationComponent> getErroneousSimulationSubComponents();
}


public abstract class AbstractSimulationComponent
        implements SimulationComponent {

    @Override
    public List<SimulationComponent> getCorrectSimulationSubComponents() {
        return Collections.emptyList();
    }

    @Override
    public List<SimulationComponent> getErroneousSimulationSubComponents() {
        return Collections.emptyList();
    }
}

public class ConcreteSubSimComponent extends AbstractSimulationComponent {
    public void doSomething() {
    }
}

Eclipse在ConcreteSubSimComponent中通知我以下问题:

The method @NonNull List<@NonNull SimulationComponent> getErroneousSimulationSubComponents() from 
 AbstractSimulationComponent cannot implement the corresponding method from SimulationComponent due 
 to incompatible nullness constraints

这个问题似乎是由中的通用通配符引起的getErroneousSimulationSubComponents()这就是我指定迁移到java8时导致注意到该问题的方法的方式。我发现,只需将此方法签名替换为中所示的方法签名,就可以“轻松”修复问题getCorrectSimulationSubComponents()我不明白为什么最后一个版本有效,而以前的版本无效。

而且,这似乎仅是具体子类中的问题。直接实现该接口的具体类不会显示任何问题。

我正在使用JavaSE-1.8,示例项目的代码无法编译,可以在https://github.com/KrisC369/NullProblemIllustration中找到

克里斯托夫·康宁

显然,此错误已通过为针对JDT-core修复错误436091引入的更改得以解决Eclipse Mars.2(4.5.2)和Eclipse Neon-M4(4.6.0-M4)中应该存在此修复程序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Kotlin泛型在类层次结构中不匹配

来自分类Dev

庞大的Java类层次结构中繁琐的泛型声明

来自分类Dev

Java泛型的不兼容类

来自分类Dev

Java泛型层次结构

来自分类Dev

覆盖Java中泛型类的方法时返回类型不兼容

来自分类Dev

Java泛型:不兼容的通配符捕获

来自分类Dev

Java泛型:不兼容的类型

来自分类Dev

Java泛型:不兼容的类型

来自分类Dev

是否可以映射(JPA)在抽象超类中使用泛型的Java类型层次结构?

来自分类Dev

并行类层次结构上下文中的Java泛型问题

来自分类Dev

泛型:如何处理类层次结构中的多个有界类型

来自分类Dev

层次结构和泛型

来自分类Dev

泛型类中的多个约束

来自分类Dev

当参数化类型通过层次结构传递时,在Java中创建泛型类型的实例吗?

来自分类Dev

如何创建约束到结构的泛型类?

来自分类Dev

泛型不兼容类型

来自分类Dev

Java中的泛型类

来自分类Dev

二叉树中的Java泛型,类型不兼容错误

来自分类Dev

Java泛型不兼容类型的链表迭代器

来自分类Dev

在Java中使用递归泛型时不兼容的类型

来自分类Dev

在泛型类中实例化 Java 泛型类

来自分类Dev

Java泛型类中的超类

来自分类Dev

Oracle Java SE 8u20 JDK中泛型静态方法调用的Java泛型不兼容类型编译错误

来自分类Dev

使用泛型的不兼容类型

来自分类Dev

Flow Array 泛型与自身不兼容?

来自分类Dev

Java中的泛型超类

来自分类Dev

java类中的多个泛型类型

来自分类Dev

在java中扩展多个类的泛型

来自分类Dev

Java @与类层次结构竞争