Suppose you have a method:
passToConsumer(Consumer<? super SubType> consumer)
然后您可以使用任何可以消费SubType
的Consumer
调用此方法:
passToConsumer(Consumer<SuperType> superTypeConsumer)
passToConsumer(Consumer<SubType> subTypeConsumer)
passToConsumer(Consumer<Object> rootConsumer)
举个例子:
class Animal{}
class Dog extends Animal{
void putInto(List<? super Dog> list) {
list.add(this);
}
}
所以我可以将 Dog
放入 List<Animal>
或 List<Dog>
中:
List<Animal> animals = new ArrayList<>();
List<Dog> dogs = new ArrayList<>();
Dog dog = new Dog();
dog.putInto(dogs);
dog.putInto(animals);
如果将
putInto(List<? super Dog> list)
方法更改为
putInto(List<Animal> list)
:
Dog dog = new Dog();
List<Dog> dogs = new ArrayList<>();
dog.putInto(dogs); // compile error, List<Dog> is not sub type of List<Animal>
or putInto(List<Dog> list)
:
Dog dog = new Dog();
List<Animal> animals = new ArrayList<>();
dog.putInto(animals);
? super T
可能会很有帮助。 - Marco13