和?
什么区别
和
? 应该何时使用另一个?
以下是我立即想到的一些差异:
-
类型参数边界可以指定多个边界 –
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
- 什么是有界类型参数?
- 什么是通配符?
extends Object>
extends Object>
是一个有界通配符 (一个未知的扩展Object
,而
是有界的( E
需要一个扩展Object
的参数化类型)。
绑定通配符与参数化上限的最微妙差异:
-
创建通用类型类时不能使用有界通配符,只允许使用类型化参数。
-
有界通配符不能在
Collection
中使用,它需要在Collection
中添加项目,因为它是未知类型,并且集合不知道它接收的是什么类型,因此它不是类型安全的。 -
有界通配符不能限制为多个generics类型(边界)。
我希望这有帮助。
如果您稍后需要参考该类型,请使用E
用?
如果您再也不必参考该类型。
在通用代码中,称为通配符的问号(?)表示未知类型。 通配符可用于各种情况:作为参数,字段或局部变量的类型; 有时作为返回类型(虽然更好的编程实践更具体)。 通配符从不用作generics方法调用,generics类实例创建或超类型的类型参数。 有关详细信息,请检查此
声明一个类型参数。
您只能在创建generics类型或方法时使用它。
...>
...>
是类型参数的通配符值 。
您只能在创建封闭的generics类型时使用它。