Java中的通配符类型参数(<?>)有什么用?
What is the need of Wildcard type parameters (<?>) in Java?
我最近在 Java 中了解了通配符并且我理解了这个概念但是似乎无法弄清楚为什么要引入它们,我们不能只使用对象 class (或相应的父 class )在函数的参数中。
通配符使方法在接受参数方面更加灵活。
考虑这个方法:
void printList(List<Object> list) {
for (Object object : list) System.out.println(object);
}
目前,这只接受一个List<Object>
作为参数:
printList(Arrays.asList(new Object())); // OK
printList(Arrays.asList("")); // Not OK
但是这样的禁令并没有什么好的理由:在 printList
里面,你 真的 并不关心 Object
列表元素是,因为你可以打印 any Object
.
因此,如果您使用通配符声明 list
参数:
// List<?> is the same as List<? extends Object>.
void printListWildcard(List<?> list) {
然后你可以传入一个 List
和你喜欢的任何元素类型:
printListWildcard(Arrays.asList(new Object())); // Still OK
printListWildcard(Arrays.asList("")); // Now OK
通配符也可以用于其他地方,例如return 类型;但是在 return 类型中应该避免使用它们,因为这样你就无法摆脱通配符(例如,如果你声明一个变量来保存通配符-returning 方法的结果)。
我最近在 Java 中了解了通配符并且我理解了这个概念但是似乎无法弄清楚为什么要引入它们,我们不能只使用对象 class (或相应的父 class )在函数的参数中。
通配符使方法在接受参数方面更加灵活。
考虑这个方法:
void printList(List<Object> list) {
for (Object object : list) System.out.println(object);
}
目前,这只接受一个List<Object>
作为参数:
printList(Arrays.asList(new Object())); // OK
printList(Arrays.asList("")); // Not OK
但是这样的禁令并没有什么好的理由:在 printList
里面,你 真的 并不关心 Object
列表元素是,因为你可以打印 any Object
.
因此,如果您使用通配符声明 list
参数:
// List<?> is the same as List<? extends Object>.
void printListWildcard(List<?> list) {
然后你可以传入一个 List
和你喜欢的任何元素类型:
printListWildcard(Arrays.asList(new Object())); // Still OK
printListWildcard(Arrays.asList("")); // Now OK
通配符也可以用于其他地方,例如return 类型;但是在 return 类型中应该避免使用它们,因为这样你就无法摆脱通配符(例如,如果你声明一个变量来保存通配符-returning 方法的结果)。