Java中如何使用泛型實現介面中的列表集合?

banq發表於2021-06-09

Java是強制實現Liskov 替換原則:

public interface Bar {
 
}
 
public interface Foo {
    Bar getBar();
}
 
public class BarImpl implements Bar {
}
 
public class FooImpl implements Foo {
    public BarImpl getBar() { ... }
}

儘管FooImpl中getter方法宣告返回的是介面子類BarImpl,但一切都可以愉快地編譯,因為子類可以替換基類,並且仍然符合 Liskov 替換原則。
但是,如果您嘗試這樣做,則會出現問題:

public interface Foo {
   List<Bar> getBars();
}
 
public class FooImpl implements Foo {
   // compiler error...
   public List<BarImpl> getBars() { ... }
}

在 Java 泛型型別系統中,List<BarImpl>不是List<Bar>. 設計這些東西的人非常聰明,可能有一個很好的技術原因。
解決:

public interface Foo<T extends Bar> {
    // we know this is "at least" a Bar
    List<T> getBars();
}
 
public class FooImpl implements Foo<BarImpl> {
    // compiles great
    public List<BarImpl> getBars() { ... }
}


在介面中引入泛型T即可。

相關文章