Interface Evolution - 继承的返回类型

时间:2016-01-14 08:15:50

标签: java inheritance

我有一个开发datamodel的应用程序(该应用程序处理旧数据和新数据)。 现在我想用原始返回类型的演变覆盖方法的返回类型:

public interface Section {

List<Item> getItems();
}

public interface Item {
    String getName();
}

public interface ItemEvolution extends Item {
      String getEvolution();
}
public interface SectionEvolution extends Section {
      List<ItemEvolution> getItems();
}

在这个星座中,我在getItems()处获得了一个不兼容的返回类型,但是我没有破坏父接口,因为ItemEvolution扩展了Item。

我该如何处理?

我正在使用Java 8

3 个答案:

答案 0 :(得分:1)

在这种情况下,您应该使用泛型。

public interface Section<E extends Item> {

    List<E> getItems();
}

public interface Item {
    String getName();
}

public interface ItemEvolution extends Item {
    String getEvolution();
}

public interface SectionEvolution extends Section<ItemEvolution> {
}

答案 1 :(得分:1)

List<ItemEvolution>List<Item>不兼容(因为您可以向后者添加Item,但不能为前者添加List<? extends Item>。这是泛型的常见缺陷。

一种解决方案是在Section中使用public interface Section { List<? extends Item> getItems(); } public interface SectionEvolution extends Section { // Or List<? extends ItemEvolution> if you might want to override this again. List<ItemEvolution> getItems(); } 作为超类的返回类型:

{{1}}

答案 2 :(得分:1)

这个很好地解释了为什么你的案子不起作用:

http://docs.oracle.com/javase/tutorial/java/generics/inheritance.html

enter image description here

所以List<ItemEvolution>不是List<Item>的子类 - 所以你需要使用带有通配符的泛型,如本文所述 - 实际上这篇文章正好解释了你的情况。

http://docs.oracle.com/javase/tutorial/java/generics/subtyping.html

enter image description here