これら2つの方法の間に概念的な違いはありますか?
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
あるため、それぞれを使用する必要があります - 2番目の方法でextends
使用する必要があります。drivers
しかし、落とし穴はありますか?私が見逃すかもしれない違いはありますか?そうでない場合、どちらのバージョンが優先されますか? また、その理由は?