Java 克服泛型put-get规则

Java 克服泛型put-get规则,java,generics,generic-list,pecs,Java,Generics,Generic List,Pecs,我已经读到了一篇文章,它会阻止您在列表中添加香蕉您的上一个代码很好,但是使用列表就可以使用相同的代码。不同之处在于,一个列表您的上一个代码很好,但是使用一个列表就可以使用相同的代码。不同之处在于列表不,在列表中有两种不同的水果是绝对好的 当您实际创建了一个列表时,就会出现这个问题。例如: List<Banana> bananas = new ArrayList<>(); bananas.add(new Banana()); // This is fine! List<

我已经读到了一篇文章,它会阻止您在
列表中添加
香蕉
您的上一个代码很好,但是使用
列表就可以使用相同的代码。不同之处在于,一个
列表您的上一个代码很好,但是使用一个
列表就可以使用相同的代码。不同之处在于
列表不,在
列表中有两种不同的
水果
是绝对好的

当您实际创建了一个
列表时,就会出现这个问题。例如:

List<Banana> bananas = new ArrayList<>();
bananas.add(new Banana());
// This is fine!
List<? extends Fruit> fruits = bananas;
// Calling fruits.get(0) is fine, as it will return a Banana reference, which
// is compatible with a Fruit reference...

// This would *not* be fine
List<Fruit> badFruits = bananas;
badFruits.add(new Apple());
Banana banana = bananas.get(0); // Eek! It's an apple!
List=newarraylist();
香蕉。添加(新香蕉());
//这很好!

列表不,在
列表中有两种不同的
水果
是绝对好的

当您实际创建了一个
列表时,就会出现这个问题。例如:

List<Banana> bananas = new ArrayList<>();
bananas.add(new Banana());
// This is fine!
List<? extends Fruit> fruits = bananas;
// Calling fruits.get(0) is fine, as it will return a Banana reference, which
// is compatible with a Fruit reference...

// This would *not* be fine
List<Fruit> badFruits = bananas;
badFruits.add(new Apple());
Banana banana = bananas.get(0); // Eek! It's an apple!
List=newarraylist();
香蕉。添加(新香蕉());
//这很好!

List考虑以下情况:列表是一个函数参数,而不是局部变量:

public void eatFruit(List<? extends Fruit> list)
{
    for (Fruit fruit : list)
    {
        eat(fruit);
    }
}

public void eatFruit(List考虑列表是函数参数而不是局部变量的情况:

public void eatFruit(List<? extends Fruit> list)
{
    for (Fruit fruit : list)
    {
        eat(fruit);
    }
}

public void eatFruit(列表谢谢你的反例。谢谢你的“Eek!”:)谢谢你的反例。谢谢你的“Eek!”:)
Banana
Apple
List<Banana> bananas = new ArrayList<>();
bananas.add(new Banana());
// This is fine!
List<? extends Fruit> fruits = bananas;
// Calling fruits.get(0) is fine, as it will return a Banana reference, which
// is compatible with a Fruit reference...

// This would *not* be fine
List<Fruit> badFruits = bananas;
badFruits.add(new Apple());
Banana banana = bananas.get(0); // Eek! It's an apple!
public void eatFruit(List<? extends Fruit> list)
{
    for (Fruit fruit : list)
    {
        eat(fruit);
    }
}