簡體   English   中英

具有接口上限的設置器,但沒有通配符的獲取器

[英]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();
}

此合約的客戶不需要知道任何已知的CartItem接口的實現,例如

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM