<? 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可能有问题.
参考文献:
<? extends Object>是有界通配符(扩展的未知数Object,而 <E extends Object>是有界的类型(E需要扩展的参数化类型Object)。
有界通配符与参数化上限最细微的区别:
创建泛型类型类时不能使用有界通配符,仅允许类型化参数。
有界通配符不能在 s 中使用,Collection因为它需要在 a 集合中添加项目,因为它是未知类型,并且集合不知道它正在接收什么类型,因此它不是类型安全的。
有界通配符不能绑定到多个泛型类型(边界)。
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
2821 次 |
| 最近记录: |