gpt4 book ai didi

Java 下界通配符

转载 作者:行者123 更新时间:2023-12-02 10:51:10 25 4
gpt4 key购买 nike

下面main方法中的List是怎么编译的?

class Breakfast {

}

class Drink extends Breakfast {

}

class Juice extends Drink {

}

class Food extends Breakfast {

}

class Bread extends Food {

}

public static void main(String[] args) {

Object object = new Object();
Drink drink = new Drink();
Juice juice = new Juice();
Bread bread = new Bread();

List<? super Drink> firstList = Arrays.asList(object, drink, juice, bread);

List<?> secondList = Arrays.asList(object, drink, juice, bread);

List<? extends Drink> thirdList = Arrays.asList(drink, juice, bread); //DOESN'T COMPILE
}

看来面包不是饮料的父类(super class)?允许编译第一和第二个列表但不允许编译第三个列表的规则是什么?如果是这样,那么它们之间的主要区别是什么

<?>  

<? super Drink>

谢谢!

最佳答案

Java 编译器使用类型推断来确定调用泛型方法的类型参数,例如 Arrays.asList 。它确定可以派生为所有参数的父类(super class)型的最具体类型。

对于第一个和第二个列表,有 Object在列表中,所以 Object是推断的类型参数。这适用于 ? super Drink ,因为? super DrinkObject 的下限满足。这也适用于 ? ,无界通配符,因为 ?将匹配任何推断的类型参数。只要这两个列表变量的名称不同,它们就会编译。

对于第三个列表(称为fourthList?),您有一个下限,? extends Drink ,这意味着推断的类型必须是 Drink 的子类型,或者Drink本身或子类。因为Breakfast是推断的类型,并且 Breakfast不是 Drink 的子类型,这是一个编译器错误。如果Bread不在列表中,那么推断的类型将为 Drink这将编译。

关于Java 下界通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52170936/

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