我有一个开发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
答案 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
所以List<ItemEvolution>
不是List<Item>
的子类 - 所以你需要使用带有通配符的泛型,如本文所述 - 实际上这篇文章正好解释了你的情况。
http://docs.oracle.com/javase/tutorial/java/generics/subtyping.html