- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一家提供餐食的餐厅。厨房里的盘子是消费者的。
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 餐厅只生产竹子。转换我的 List<? super Food>
的最佳做法是什么?无需在内存中创建/复制 ArrayList ?
更完整的要点写在这里:https://gist.github.com/nicolas-zozol/8c66352cbbad0ab67474a776cf007427
最佳答案
或者,也许您可以编写餐厅和厨房的打字版本?
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;
}
}
关于java - PECS:如何将消费者转变为生产者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45212443/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
为什么我不能向消费者添加一个整数? import java.util.*; public class Test { public static void main(String[] args)
我有一家提供餐食的餐厅。厨房里的盘子是消费者的。 class Food{} class Bamboo extends Food {} interface Kitchen { void buil
Joshua Bloch 提出了 PECS,它规定了何时使用 的规则?扩展 T 和 ? super T。如果您从集合框架的角度考虑 PECS,那么它非常简单。如果向数据结构添加值,请使用 ? supe
我对这个方法有疑问来自 java.util.Collections : public class Collections { public static void copy(List dest
我知道PECS是什么意思。 生产者扩展,消费者 super 。 问题是我怎么知道它是消费者还是生产者? 此代码是否也遵循“PECS” public class Tree { //List of
我正在尝试匹配短语中的“单词”pec+ I cannot find pec+ 我已经尝试了模式\bpec\+\b,但是没有匹配项。 最佳答案 因为 + 不是单词字符,您需要使用 \B 匹配非单词边界来
在 Effective Java 中,Joshua Bloch 讨论了 PECS(Producer-Extends,Consumer-Super)的原理。 我对此的理解是,为了提高 API 的灵活性,
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
阅读 Java Essentials,第 2 版,有一个称为 PECS 的规则用于方法参数中的类型安全。如果它产生你扩展,消耗你使用 super 。对不起,如果我定义错误,因为我不明白。 谁能阐明 J
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我是一名优秀的程序员,十分优秀!