Java是强制实现Liskov 替换原则:
public interface Bar { |
尽管FooImpl中getter方法声明返回的是接口子类BarImpl,但一切都可以愉快地编译,因为子类可以替换基类,并且仍然符合 Liskov 替换原则。
但是,如果您尝试这样做,则会出现问题:
public interface Foo { |
在 Java 泛型类型系统中,List<BarImpl>不是List<Bar>. 设计这些东西的人非常聪明,可能有一个很好的技术原因。
解决:
public interface Foo<T extends Bar> { |
在接口中引入泛型T即可。