这两种方法有什么概念上的区别吗?Java泛型 - 扩展和超级用法的特例
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
第二种方法。但是有什么问题吗?我可能错过的任何区别?如果不是,哪一个版本是首选的,为什么?