【问题标题】:What does this syntax mean (List<? extends Number> data) [duplicate]这个语法是什么意思(List<? extends Number> data)[重复]
【发布时间】:2013-07-26 17:37:56
【问题描述】:

我正在尝试使用charts4j api,其中一个构造函数有这个:

public static Data newData(List&lt;? extends Number&gt; data)

对我来说,它看起来像是某种形式的泛型,但我以前从未见过这种表示法,我不明白。

【问题讨论】:

  • @Down voter 我做错了什么?
  • 我对这个问题投了反对票,因为它没有显示出研究成果。我在 Google 上搜索了“java 问号扩展”并立即找到了之前的 SO 问题以及关于通配符的 Java 教程泛型文章。
  • @paulbellora 我尊重您的反对意见,但请不要妄下结论。不,我在哪里说我没有搜索,但我不明白。
  • @code4me 我相信你,但问题并没有显示研究工作。对于未来,请务必引用并链接到您已经阅读过的资源,并解释为什么它们没有帮助或您不了解它们的哪些方面。

标签: java generics constructor


【解决方案1】:

这是upper-bounded wildcard: ? extends Number

这意味着data 可以是Number 或其子类的任何内容的列表,例如List&lt;Number&gt;List&lt;Integer&gt;List&lt;Double&gt; 等。

Java 中的泛型不是协变的,因此List&lt;Double&gt; 不是List&lt;Number&gt;。这里,List&lt;? extends Number&gt; 类型的参数允许List&lt;Double&gt;List&lt;Number&gt;,但List&lt;Number&gt; 类型的参数不允许List&lt;Double&gt;

至于List部分,它可以是任何实现List的东西,例如LinkedList&lt;Integer&gt;ArrayList&lt;Double&gt;

【讨论】:

  • 感谢您非常清晰简洁的回答!
  • 如果您解释为什么使用? extends Number 而不是List&lt;Number&gt; 那就太好了:)
  • @nachokk 我添加了更多关于为什么? extends Number 在这里工作得更好。
【解决方案2】:
public static Data newData(List<? extends Number> data)

这定义了一个接收实现List 接口(例如ArrayList)的集合的方法,该集合包含Number 类的任何子类(甚至是Number 类本身)。

确实,这个概念与泛型有关,它被称为上界通配符。长话短说:它允许您编写一个没有特定类型限制的方法,而是一个层次结构限制。

【讨论】:

    【解决方案3】:

    是的,它是泛型中的wildcard。这意味着该方法将接受任何扩展 Number 的类的 List 类型。

    示例:List&lt;Integer&gt;, List&lt;Double&gt;

    【讨论】:

      【解决方案4】:
      <T extends SomeClass>
      

      在实际参数可以是某个类或它的任何子类时使用。所以在你的情况下:

      public static Data newData(List<? extends Number> data)
      

      您的方法可以接受 Number 类型的任何类的列表。

      要了解有关 Java 泛型的更多信息,请参阅:

      http://docs.oracle.com/javase/tutorial/extra/generics/methods.html

      【讨论】:

        【解决方案5】:

        它是一个泛型类型。这意味着data 参数是任何扩展 Number 的类的列表。即,如果您有自定义类:

        public class Nomber extends number {
            //stuff...
        }
        

        它将采用List&lt;Nomber&gt; 作为变量。

        【讨论】:

          【解决方案6】:

          表示数据列表只能添加Number类型或SubNumber类型的对象为Double、Integer...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-25
            • 1970-01-01
            • 2012-02-22
            • 2012-08-21
            • 2011-10-27
            • 1970-01-01
            相关资源
            最近更新 更多