和?

什么区别 ? 应该何时使用另一个?

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

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

  • 你可以使用通配符下限 – ? super A ? super A有效,但没有类型参数 – T super A无效。

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

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

     public  void merge(List list1, List list2) { } 

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

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

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


参考文献:

  • Angelika Langer – JavaGenericsFAQ
    • 什么是有界类型参数?
    • 什么是通配符?

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

绑定通配符与参数化上限的最微妙差异:

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

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

  • 有界通配符不能限制为多个generics类型(边界)。

我希望这有帮助。

如果您稍后需要参考该类型,请使用E? 如果您再也不必参考该类型。

在通用代码中,称为通配符的问号(?)表示未知类型。 通配符可用于各种情况:作为参数,字段或局部变量的类型; 有时作为返回类型(虽然更好的编程实践更具体)。 通配符从不用作generics方法调用,generics类实例创建或超类型的类型参数。 有关详细信息,请检查此

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

是类型参数的通配符
您只能在创建封闭的generics类型时使用它。