gpt4 book ai didi

java - 违抗泛型?可以将狗添加到列表<? super 猫>

转载 作者:行者123 更新时间:2023-11-29 06:51:13 27 4
gpt4 key购买 nike

<分区>

这不是一个重复的问题,因为我特别询问编译器如何允许将 Cat 添加到 List<? super Cat> catList已经包含狗的集合。你看到 animaList 已经包含猫和狗,因为它们是动物,但调用 addCat 需要 List<? super Cat>允许添加一个新的 Cat 即 add(new RedCat());尽管该列表已经包含一条狗。编译器不应该为了满足 List<? super Cat> 而不允许这样做吗?签名,因为它试图将猫添加到已经包含狗的列表中?

然而显式调用

catList.add(new Dog());

强制约束。所以问题是为什么行为不同?

原问题:我一直在玩 Java 泛型并注意到一个奇怪的(?)问题。在下面的代码片段中,您可以将 Dog 和 Cat 添加到 animalList 中,然后将此列表传递到 addCat(List<? super Cat> catList) 中。
并添加另一个 Cat 实例。所以我们有一个包含 Dogs 和 Cats 的列表,它覆盖了? super 猫边界,因为它不应该允许狗?

但是一旦你取消注释

//catList.add(new Dog());

行,你得到一个编译时错误

(argument mismatch; Dog cannot be converted to CAP#1)

这是怎么回事? code由这个 tutorial 修改

 package com.tutorialspoint;

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

public class GenericsTester {

public static void addCat(List<? super Cat> catList) {
catList.add(new RedCat());
catList.add(new Cat());

//catList.add(new Dog());

System.out.println("Cat Added");
}

public static void main(String[] args) {
List<Animal> animalList= new ArrayList<Animal>();
List<Cat> catList= new ArrayList<Cat>();
List<RedCat> redCatList= new ArrayList<RedCat>();
List<Dog> dogList= new ArrayList<Dog>();

animalList.add(new Dog());
animalList.add(new Cat());
animalList.add(new RedCat());

addCat(animalList);

System.out.println("all ok");
}
}
class Animal {}

class Cat extends Animal {}

class RedCat extends Cat {}

class Dog extends Animal {}

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com