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);    
}

以下main方法在没有任何警告的情况下编译,并且在没有任何运行时异常的情况下执结果是预期的一个–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原理,并且因为第一种方法中的人是消费者,所以应该分别使用超级 – 在第二种方法中应该使用扩展名.但是有没有陷阱?我可能会错过任何差异?如果没有,哪个版本是首选,为什么?

解决方法:

不同之处在于推断T的类型:在add1中它是第一个集合(Driver)的组件类型,在add2中它是第二个集合(Person)的组件类型.

在这种情况下,T未在方法体中使用,因此没有明显的差异.

上一篇:java 继承extends 的相关知识点


下一篇:java – 在调用超级构造函数之前检查变量的有效性