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