让我们用一个更直接的例子:
Set<? extends Serializable> serializables;
这个声明了一个变量,它可以保存对s,s等的a的引用:Set
Integer
Float
serializables = new HashSet<Serializable>(); // valid
serializables = new HashSet<Number>(); // this is valid as well
serializables = new HashSet<Integer>(); // valid
另一方面,这个:
Set<Serializable> serializables;
但是,只能容纳一个对象:Set
Serializable
serializables = new HashSet<Serializable>();
serializables = new TreeSet<Serializable>();
所以这个将是一个编译器错误:
List<Serializable> numbers = new ArrayList<Integer>();
推论:
如果你想要一个可以保存任何子类型的字段,请使用:Notifiable
Set<Notifiable> notifiables = new HashSet<Notifiable>();
如果你想限制可以使用的Notifiable
的子类型,那么这就是要走的路:
Set<? extends Notifiable> notifiables = new HashSet<MyNotifiable>();
补遗:
这是完全合法的,因此您可以根据需要对以后进行改造:Set
Set<? extends Notifiable> notifiables = new HashSet<NotifiableA>();
notifiables = new HashSet<NotifiableB>();