4

これら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しかし、落とし穴はありますか?私が見逃すかもしれない違いはありますか?そうでない場合、どちらのバージョンが優先されますか? また、その理由は?

4

2 に答える 2

4

The difference is in the type that is inferred for T: in add1 it is the component type of the first collection (Driver), in add2 it's the component type of the second collection (Person).

In this case T is not used in the method body, so there's no visible difference.

于 2013-08-12T08:12:22.380 に答える
2

A が B のスーパータイプである場合、B は A を拡張するため、2 つのバージョンに違いはありません。

superと の両方を使用することもできることに注意してくださいextends

public static <T> void add3(final Collection<? extends T> drivers, final Collection<? super T> persons) {
    persons.addAll(drivers);    
}
于 2013-08-12T08:38:34.867 に答える