Java <;之间有什么区别;?扩展对象>;及<;扩展对象>;?

Java <;之间有什么区别;?扩展对象>;及<;扩展对象>;?,java,generics,Java,Generics,之间有什么区别如果以后需要参考该类型,请使用E。如果不必再次引用类型,请使用?。声明类型参数。 您只能在创建泛型类型或方法时使用它 在泛型代码中,被称为通配符的问号(?)表示未知类型。通配符可用于多种情况:作为参数、字段或局部变量的类型;有时作为返回类型(尽管更具体一些是更好的编程实践)。通配符永远不会用作泛型方法调用、泛型类实例创建或超类型的类型参数。欲了解更多信息,请查看以下我立即想到的一些差异: 类型参数边界可以指定多个边界-T扩展A&B,但使用通配符不能指定多个边界-?扩展A&B无效

之间有什么区别如果以后需要参考该类型,请使用
E
。如果不必再次引用类型,请使用

声明类型参数。
您只能在创建泛型类型或方法时使用它


在泛型代码中,被称为通配符的问号(?)表示未知类型。通配符可用于多种情况:作为参数、字段或局部变量的类型;有时作为返回类型(尽管更具体一些是更好的编程实践)。通配符永远不会用作泛型方法调用、泛型类实例创建或超类型的类型参数。欲了解更多信息,请查看以下我立即想到的一些差异:

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

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

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

  • 在方法内部,如果希望传递的参数的类型参数之间存在某种关系,则必须使用类型参数边界。例如,您希望传递具有相同类型参数的两个参数化类型。使用通配符边界无法执行此操作。因此,下面的方法声明将采用两个相同类型参数的列表,它们扩展了
    Number

    public <T extends Number> void merge(List<T> list1, List<T> list2) {
    }
    
    公共作废合并(列表1、列表2){
    }
    
最后,我将从有效的Java中添加一些要点-第28项:使用有界通配符来增加API的灵活性:

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

不要将通配符类型用作返回类型。它将迫使用户在客户端代码中使用通配符类型,而不是为用户提供额外的灵活性。如果使用得当,类的用户几乎看不到通配符类型。它们使方法接受它们应该接受的参数,并拒绝它们应该拒绝的参数如果类的用户必须考虑通配符类型,则该类的API可能有问题。


参考文献:


您可以重用
E
。它们是互斥的。我会使用
在集合中实际使用通配符,如果通配符的类型确实是@Lorenzo Baracchi,则可以添加项,但这不是本文要求的。:-)@BuhakeSindi事实上,你的第二点在差异的意义上是错误的,因此没有任何差异,或者“类型绑定可用于需要在集合中添加项的集合…”是否需要解释?@manocha_ak,simple:创建一个简单的示例:
collection