gpt4 book ai didi

Java 泛型 - 扩展和 super 用法的特例

转载 作者:搜寻专家 更新时间:2023-11-01 02:11:28 24 4
gpt4 key购买 nike

这两种方法在概念上有区别吗?

public static <T> void add1(final Collection<T> drivers, final Collection<? super T> persons) {
persons.addAll(drivers);
}

public static <T> void add2(final Collection<? extends T> drivers, final Collection<T> persons) {
persons.addAll(drivers);
}

以下主要方法在没有任何警告的情况下进行编译,并且在没有任何运行时异常的情况下执行。结果是预期的 4。

public static void main(String[] args) {
final Person person1 = new Person();
final Person person2 = new Person();
final Collection<Person> persons = new ArrayList<>();
persons.add(person1);
persons.add(person2);

final Driver driver1 = new Driver();
final Collection<Driver> drivers = new ArrayList<>();
drivers.add(driver1);

add1(drivers, persons);
add2(drivers, persons);

System.out.println(persons.size());
}

我了解 PECS 原理,由于第一个方法中的 persons 是消费者,因此应该分别使用 super - extends应该用于第二种方法中的drivers。但是有什么陷阱吗?我可能会错过任何区别吗?如果不是,首选哪个版本,为什么?

最佳答案

区别在于为T推断的类型:在add1中它是第一个集合的组件类型(Driver) ,在add2中是第二个集合的组件类型(Person)。

在这种情况下,方法主体中未使用 T,因此没有明显的区别。

关于Java 泛型 - 扩展和 super 用法的特例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18182132/

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