为什么不允许使用泛型和通配符?

Kye*_*JmD 1 java generics wildcard super

这段代码

static void writeTo(List<? super Apple> apples) {
        apples.add(new Apple());
        apples.add(new Jonathan());
    }
Run Code Online (Sandbox Code Playgroud)

该代码的作者说明了这一点

参数apples是某种类型的List,它是Apple的基本类型; 因此,您知道添加Apple或Apple的子类型是安全的.由于下限是Apple,

Jonathan是Apple的子类.

但是当我尝试这个时

    List<Jonathan> loj = new ArrayList<Jonathan>();
    listSuper(loj);
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误

The method listSuper(List<? super Apple>) in the type Basket<T> is not applicable for the arguments (List<Jonathan>)
Run Code Online (Sandbox Code Playgroud)

哪里listSuper是这样的

static void listSuper (List<? super Apple> cont) {}
Run Code Online (Sandbox Code Playgroud)

这两者有何不同?

还有什么让我对我发布的第一个代码感到困惑的是我想到的?super T意味着任何基本类型的T.但是从它的外观上他添加了T的子类型.我很困惑.

axt*_*avt 6

List<? super Apple>意味着List你可以添加一个Apple(并且因为Jonathan Apple,你也可以将Jonathans加入到List该类型中).

它可以是List<Apple>,List<Fruit>或者List<Object>,但不是List<Jonathan>,因为你不能把任意Apples List<Jonathan>.如您所见,在这种情况下?可以是一个Apple或任何超类.

List<? extends Apple>意味着List你可以得到一个Apple.它可以是List<Apple>List<Jonathan>,但不能List<Fruit>,因为List<Fruit>不能保证只包含Apple秒.

这种解释被称为"生产者 - extends,消费者 - super"规则:如果参数充当元素的消费者,则应该声明它super,反之亦然.