Java泛型(通配符)

Pab*_*dez 106 java generics bounded-wildcard

我有几个关于Java中通用通配符的问题:

  1. List<? extends T>和之间有什么区别List<? super T>

  2. 什么是有界通配符,什么是无界通配符?

Bil*_*ard 119

在你的第一个问题,<? extends T>而且<? super T>是有界通配符的例子.一个无界的通配符看起来像<?>,基本上意味着<? extends Object>.它松散地意味着通用可以是任何类型.有界通配符(<? extends T><? super T>)通过声明它必须扩展特定类型(<? extends T>称为上限)或必须是特定类型的祖先(<? super T>称为下限)对类型施加限制.

Java教程在通配符使用通配符更有趣的文章中对泛型有一些非常好的解释.

  • 只是想推荐关于Java Generics的另一个参考:http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html (3认同)
  • @Pablo:`<?super C>`意味着你的类型被限制在类型层次结构中超过`C`的东西.(对不起,迟到的回复.我想我们2年前没有评论通知?) (3认同)

oxb*_*kes 48

如果你有一个类层次结构A,B是A的子类,而C和D都是B的子类,如下所示

class A {}
class B extends A {}
class C extends B {}
class D extends B {}
Run Code Online (Sandbox Code Playgroud)

然后

List<? extends A> la;
la = new ArrayList<B>();
la = new ArrayList<C>();
la = new ArrayList<D>();

List<? super B> lb;
lb = new ArrayList<A>(); //fine
lb = new ArrayList<C>(); //will not compile

public void someMethod(List<? extends B> lb) {
    B b = lb.get(0); // is fine
    lb.add(new C()); //will not compile as we do not know the type of the list, only that it is bounded above by B
}

public void otherMethod(List<? super B> lb) {
    B b = lb.get(0); // will not compile as we do not know whether the list is of type B, it may be a List<A> and only contain instances of A
    lb.add(new B()); // is fine, as we know that it will be a super type of A 
}
Run Code Online (Sandbox Code Playgroud)

有界通配符就像? extends BB是某种类型.也就是说,类型是未知的,但可以在其上放置"绑定".在这种情况下,它受某些类的限制,这是B的子类.


bla*_*ank 38

乔希布洛赫也有当使用一个很好的解释super,并extends在此谷歌IO视频通话,他提到了生产者extends消费者super记忆.

从演示幻灯片:

假设您要添加批量方法 Stack<E>

void pushAll(Collection<? extends E> src);

- src是一个E制作人

void popAll(Collection<? super E> dst);

- dst是E消费者

  • 床 - 为什么不在这个答案中包含这个例子,使它完整无缺.链接是短暂的. (2认同)