[英]Setter with upper bound of Interface, but getter without wildcard
根據聲納規則RSPEC-1452 的建議,
不應在返回類型中使用通用通配符類型
如何定義接受List<? extends Item>
List<? extends Item>
,但返回List<Item>
的 getter 方法?
考慮以下Cart
接口的合約:
interface Cart {
public List<Item> getItems();
}
interface Item {
public int getCost();
}
此合約的客戶不需要知道任何已知的Cart
或Item
接口的實現,例如
void getValue(Cart cart) {
int sum = cart.getItems().stream().mapToInt(Item::getCost).sum();
}
然而,實現Cart
接口的庫顯然必須處理具體的類。 假設它(或其Builder
)還必須公開一個setItems
方法,以便另一個內部 class 可以設置整個項目列表。 Interface 的上限允許將List<DefaultItem>
傳遞給setItems
方法。
static class DefaultCart implements Cart {
private List<Item> items;
public void setItems(List<? extends Item> items) {
this.items = new ArrayList<Item>(items);
}
@Override
public List<Item> getItems() {
return items;
}
}
我對上面的setItems
方法不滿意,因為它創建了列表的另一個副本。 有什么更好的方法來處理這個問題?
如何定義接受
List<? extends Item>
List<? extends Item>
,但返回List<Item>
的 getter 方法?
你不能,因為List<? extends Item>
List<? extends Item>
不是List<Item>
的子類,即它們之間的賦值不兼容。
解釋見: List<Dog>
是List<Animal>
的子類嗎
你可以做的是讓你的 class 通用,所以你不使用通配符:
static class DefaultCart<E extends Item> implements Cart {
private List<E> items;
public void setItems(List<E> items) {
this.items = items;
}
@Override
public List<E> getItems() {
return items;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.