Java 泛型的奇怪行为

Java 泛型的奇怪行为,java,generics,polymorphism,Java,Generics,Polymorphism,我想实现一些 在代码示例中遇到了一些问题 我想将使用父引用的子元素的列表传递到方法: 以下是main()中的代码片段: GoodPackage truck=new GoodPackage(); truck.setGoodsInside(新ArrayList()); 床=新床(); GoodPackage doubleTriplePackedBed=新GoodPackage(); doubleTriplePackedBed.setGoodsInside(Arrays.asList(new Good

我想实现一些 在代码示例中遇到了一些问题

我想将使用父引用的子元素的列表传递到方法

以下是main()中的代码片段:

GoodPackage truck=new GoodPackage();
truck.setGoodsInside(新ArrayList());
床=新床();
GoodPackage doubleTriplePackedBed=新GoodPackage();
doubleTriplePackedBed.setGoodsInside(Arrays.asList(new GoodPackage().setGoodsInside(Arrays.asList(bed)));
其他类别:

abstract class Goods {
    public abstract Integer interpret(CurrentPricesContext context);
}

class GoodPackage extends Goods {
    private List<? super Goods> goodsInside;

    @Override
    public Integer interpret(CurrentPricesContext context) {
        int totalSum = 0;
        for (Iterator<? super Goods> iter = goodsInside.iterator(); iter.hasNext(); iter.next()) {
            Goods good = (Goods) iter.next();
            totalSum += good.interpret(context);
        }
        /*for (Goods goods : goodsInside) {
            totalSum += goods.interpret(context);
        }*/
        return totalSum;
    }

    public List<? super Goods> getGoodsInside() {
        return goodsInside;
    }

    public void setGoodsInside(List<? super Goods> goodsInside) {
        this.goodsInside = goodsInside;
    }
}

class Bed extends Goods {
    @Override
    public Integer interpret(CurrentPricesContext context) {
        int price = context.getPrice(GoodsInstances.BAD);
        System.out.printf("Bad: %d%n", price);
        return price;
    }
}
抽象类商品{
公共抽象整数解释(CurrentPricesContext上下文);
}
货物包装延伸类{

private ListA
XIt看起来像是你的意思,它几乎扩展了你使用super的所有地方……而且你的for循环会跳过所有其他元素,我认为这是你不想要的。没有必要通过发布源代码的图像而不是实际代码本身来浪费每个人的带宽:这个问题与“动态des”无关修补程序“.@user207421和一个长延迟修复了该注释。
abstract class Goods {
    public abstract Integer interpret(CurrentPricesContext context);
}

class GoodPackage extends Goods {
    private List<? super Goods> goodsInside;

    @Override
    public Integer interpret(CurrentPricesContext context) {
        int totalSum = 0;
        for (Iterator<? super Goods> iter = goodsInside.iterator(); iter.hasNext(); iter.next()) {
            Goods good = (Goods) iter.next();
            totalSum += good.interpret(context);
        }
        /*for (Goods goods : goodsInside) {
            totalSum += goods.interpret(context);
        }*/
        return totalSum;
    }

    public List<? super Goods> getGoodsInside() {
        return goodsInside;
    }

    public void setGoodsInside(List<? super Goods> goodsInside) {
        this.goodsInside = goodsInside;
    }
}

class Bed extends Goods {
    @Override
    public Integer interpret(CurrentPricesContext context) {
        int price = context.getPrice(GoodsInstances.BAD);
        System.out.printf("Bad: %d%n", price);
        return price;
    }
}
  setGoodsInside (java.util.List<? super patterns.behavioral.interpreter.Goods>)   
  can't be applicable to java.util.List<patterns.behavioral.interpreter.Bed>
class GoodPackage extends Goods {
    private List<? extends Goods> goodsInside;

    @Override
    public Integer interpret(CurrentPricesContext context) {
        int totalSum = 0;
        for (Goods goods : goodsInside) {
            totalSum += goods.interpret(context);
        }
        return totalSum;
    }

    public List<? extends Goods> getGoodsInside() {
        return goodsInside;
    }

    public void setGoodsInside(List<? extends Goods> goodsInside) {
        this.goodsInside = goodsInside;
    }
}
    for (Iterator<? super Goods> iter = goodsInside.iterator(); iter.hasNext(); iter.next()) {
        Goods good = (Goods) iter.next();
        totalSum += good.interpret(context);
    }
    for (Iterator<? extends Goods> iter = goodsInside.iterator(); iter.hasNext();) {
        Goods good = iter.next();
        totalSum += good.interpret(context);
    }