首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中的接口和泛型

Java中的接口和泛型
EN

Stack Overflow用户
提问于 2014-03-24 02:35:54
回答 1查看 708关注 0票数 16

我有代码:

代码语言:javascript
复制
Set<? extends Notifiable> notifiables;

Notifiable是一个接口。我不明白上面的代码和:

代码语言:javascript
复制
Set<Notifiable> notifiables;

如果Notifiable是一个类,那么我可以理解其中的区别,第一个代码允许Notifiable和Notifiable的任何子类,而第二个代码只允许Notifiable (而不是任何子类)

由于您不能拥有接口的实例,我可以将/etc添加到集合中吗?在我看来只有两种选择,要么是实现Notifiable的任何东西(在这种情况下,这与第一个代码有什么不同),要么是只有“Notifiable的实例”,它不存在,因此什么都不存在(这是没有意义的,应该会抛出编译时错误)。

EN

回答 1

Stack Overflow用户

发布于 2014-03-28 20:53:51

对于集合类型中的一级泛型,? extends通配符的作用不是很重要,因为所有的集合方法看起来都像这样

代码语言:javascript
复制
E get(int index);
boolean add(E e);

它们实际上与以下内容相同:

代码语言:javascript
复制
? extends E get(int index);
boolean add(? extends E e);

由于Java子类型的多态性规则。

但是,当子类型规则生效时,通配符很重要:

代码语言:javascript
复制
    List<Integer> list = Arrays.asList(1);
    List<? extends Number> numSubTypeList = list; // Works
    List<Number> numList = list; // Illegal

同样,多级泛型也是如此:

代码语言:javascript
复制
    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是子类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22595234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档