我有代码:
Set<? extends Notifiable> notifiables;
Notifiable是一个接口。我不明白上面的代码和:
Set<Notifiable> notifiables;
如果Notifiable是一个类,那么我可以理解其中的区别,第一个代码允许Notifiable和Notifiable的任何子类,而第二个代码只允许Notifiable (而不是任何子类)
由于您不能拥有接口的实例,我可以将/etc添加到集合中吗?在我看来只有两种选择,要么是实现Notifiable的任何东西(在这种情况下,这与第一个代码有什么不同),要么是只有“Notifiable的实例”,它不存在,因此什么都不存在(这是没有意义的,应该会抛出编译时错误)。
发布于 2014-03-28 20:53:51
对于集合类型中的一级泛型,? extends
通配符的作用不是很重要,因为所有的集合方法看起来都像这样
E get(int index);
boolean add(E e);
它们实际上与以下内容相同:
? extends E get(int index);
boolean add(? extends E e);
由于Java子类型的多态性规则。
但是,当子类型规则生效时,通配符很重要:
List<Integer> list = Arrays.asList(1);
List<? extends Number> numSubTypeList = list; // Works
List<Number> numList = list; // Illegal
同样,多级泛型也是如此:
Collection<Collection<Number>> col1 = new ArrayList<Collection<Number>>();
col1.add(list); // Illegal
Collection<Collection<? extends Number>> col2 = new ArrayList<Collection<? extends Number>>();
col2.add(list); // Works
然而,即使是col2
的签名也不适合泛型库,这些库可能会期望Collection<? extends Collection<? extends Number>>
,而col2
是子类型。
https://stackoverflow.com/questions/22595234
复制相似问题