<?有什么区别?extends Object>和<E extends Object>?

Vim*_*ain 14 java generics

<? extends Object>和之间有什么区别<E extends Object>?应该何时使用另一个?

Roh*_*ain 15

以下是我立即想到的一些差异:

  • 类型参数边界可以指定多个边界 - T extends A & B但是使用通配符不能指定多个边界 - ? extends A & B无效.

  • 您可以使用通配符设置下限 - ? super A有效,但不能使用类型参数 - T super A无效.

  • 创建泛型类型时,不能使用通配符边界.您必须使用类型参数边界.

  • 在方法内部,如果要在传递的参数的类型参数之间建立某种关系,则必须使用类型参数边界.例如,您希望传递两个具有相同类型参数的参数化类型.你不能用通配符边界做到这一点.因此,以下方法声明将采用两个相同类型参数的列表,即扩展Number.

    public <T extends Number> void merge(List<T> list1, List<T> list2) {
    }
    
    Run Code Online (Sandbox Code Playgroud)

最后,我将从Effective Java中添加一些要点- 第28项:使用有界通配符来增加API灵活性:

为获得最大的灵活性,请在表示生产者或使用者的输入参数上使用通配符类型 如果输入参数既是生产者又是消费者,那么通配符类型对您没有好处:您需要一个精确的类型匹配,这是您在没有任何通配符的情况下获得的.

不要将通配符类型用作返回类型.它不会为您的用户提供额外的灵活性,而是迫使他们在客户端代码中使用通配符类型.正确使用的通配符类型对于类的用户几乎是不可见的.它们使方法接受它们应该接受的参数并拒绝它们应该拒绝的参数.如果类的用户必须考虑通配符类型,那么类的API可能有问题.


参考文献:


Buh*_*ndi 6

<? extends Object>是有界通配符(扩展的未知数Object,而 <E extends Object>是有界的类型(E需要扩展的参数化类型Object)。

有界通配符与参数化上限最细微的区别:

  • 创建泛型类型类时不能使用有界通配符,仅允许类型化参数。

  • 有界通配符不能在 s 中使用,Collection因为它需要在 a 集合中添加项目,因为它是未知类型,并且集合不知道它正在接收什么类型,因此它不是类型安全的。

  • 有界通配符不能绑定到多个泛型类型(边界)。

我希望这有帮助。


Chr*_*ung 5

E如果以后需要引用类型,请使用。?如果您永远不必再次引用该类型,请使用。