【问题标题】:What is the need of Wildcard type parameters (<?>) in Java?Java中通配符类型参数(<?>)有什么需要?
【发布时间】:2021-09-21 07:59:27
【问题描述】:

我最近了解了Java中的通配符并且我理解了这个概念但是似乎无法弄清楚为什么要引入它们,我们不能只在参数中使用 Object 类(或相应的父类)吗一个函数。

【问题讨论】:

  • “我们不能在函数的参数中只使用 Object 类(或相应的父类)吗?”不,因为List&lt;String&gt; 不是List&lt;Object&gt;,而是List&lt;? extends Object&gt; 又名List&lt;?&gt;
  • 好的,现在我明白了,所以它专门回答了集合带来的这类问题,谢谢@AndyTurner
  • 不只是集合:任何泛型类型。

标签: java wildcard


【解决方案1】:

通配符使方法在接受的参数方面更加灵活。

考虑这种方法:

void printList(List<Object> list) {
  for (Object object : list) System.out.println(object);
}

目前,这只会接受 List&lt;Object&gt; 作为参数:

printList(Arrays.asList(new Object()));  // OK
printList(Arrays.asList(""));            // Not OK

但是这样的禁令并没有一个很好的理由:在printList 内部,你并不真的关心列表元素是什么类型的Object,因为你可以打印任何 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

通配符可以也可以用在其他地方,例如返回类型;但在返回类型中应避免使用它们,因为这样您就无法摆脱通配符(例如,如果您声明一个变量来保存通配符返回方法的结果)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2015-09-30
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    相关资源
    最近更新 更多