首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PECS:如何将消费者转变为生产者?

PECS:如何将消费者转变为生产者?
EN

Stack Overflow用户
提问于 2017-07-20 18:42:49
回答 2查看 83关注 0票数 1

我有一家供应餐食的餐馆。厨房得到的盘子是消费者的。

代码语言:javascript
复制
class Food{}
class Bamboo extends Food {}

interface Kitchen {
    void build(List<? super Food> dessert);
}

abstract class Restaurant {
    Kitchen kitchen;

    public Restaurant(Kitchen kitchen) {
        this.kitchen = kitchen;
    }

    List<? extends Food> getMeals() {
        List<Food> food = new ArrayList<>();
        this.kitchen.build(food);
        return food;
    }
}

class PandaKitchen implements Kitchen{

    // Exact signature of the Kitchen
    @Override
    public void build(List<? super Food> plate) {
        // the List IS a consumer of bamboos
        plate.add(new Bamboo());
    }
}

// Bamboo specialized restaurant
class OhPanda extends Restaurant {

    public OhPanda() {
        super(new PandaKitchen());
    }

    // Specialized signature of List<? extends Food>
    @Override
    List<Bamboo> getMeals() {
        List<? super Food> bamboos = new ArrayList<>();
        this.kitchen.build(bamboos);

        // Obviously here, there is no information of having only Bamboos
        return bamboos; // <==== FAIL

        //return (List<Bamboo>) bamboos; // would not compile
    }
}

在最后一行中,我知道我的OhPanda餐厅只生产竹子。在不在内存中创建/复制ArrayList的情况下转换List<? super Food>的最佳实践是什么?

更完整的要点写在这里:https://gist.github.com/nicolas-zozol/8c66352cbbad0ab67474a776cf007427

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-20 20:26:24

或者,也许你可以写一个餐厅和厨房的打字版本?

代码语言:javascript
复制
package kitchen;

import java.util.ArrayList;
import java.util.List;

class Food{}
class Bamboo extends Food {}

interface Kitchen<F> {
    void build(List<F> dessert);
}

abstract class Restaurant<T> {
    protected Kitchen kitchen;

    Restaurant(Kitchen kitchen) {
        this.kitchen = kitchen;
    }

    List<T> getMeals() {
        List<T> food = new ArrayList<>();
        kitchen.build(food);
        return food;
    }
}

class PandaKitchen implements Kitchen<Bamboo>{

    @Override
    public void build(List<Bamboo> dessert)
    {
        dessert.add(new Bamboo());
    }
}

/** Bamboo specialized restaurant*/
class OhPanda extends Restaurant<Bamboo> {

    OhPanda() {
        super(new PandaKitchen());
    }

    @Override
    List<Bamboo> getMeals() {
        List<Bamboo> bamboos = new ArrayList<>();
        kitchen.build(bamboos);
        return bamboos;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2017-07-20 18:55:00

我认为您错误地使用了下限通配符。通过在实现中不指定通配符的类,您可以使用它来转向您可能面临的上限通配符限制。我不认为你想和食物及其超级类型打交道。你只想使用食品和它的衍生产品,你应该找到一个“扩展食品”的解决方案,甚至去掉通配符,使用List<食品>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45212443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档