这个语法是什么意思(List <! - ?extends Number - > data)

时间:2013-07-26 17:37:56

标签: java generics constructor

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

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

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

6 个答案:

答案 0 :(得分:4)

这是upper-bounded wildcard? extends Number

这意味着data可以是Number或子类的任何列表,例如List<Number>List<Integer>List<Double>等。

Java中的泛型不是协变的,因此List<Double>不是List<Number>。此处,List<? extends Number>类型的参数允许List<Double>以及List<Number>,但List<Number>类型的参数不允许List<Double>

对于List部分,它可以是实现List的任何内容,例如LinkedList<Integer>ArrayList<Double>

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

示例:List<Integer>, List<Double>

答案 3 :(得分:1)

<T extends SomeClass>
当实际参数可以是某个类或其任何子类时,使用

。所以在你的情况下:

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

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

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

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

答案 4 :(得分:0)

这是一种通用类型。这意味着data参数是任何扩展Number的类的List。即如果您有自定义类:

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

它将List<Nomber>作为变量。

答案 5 :(得分:0)

这意味着数据列表只能将Number类型或SubNumber类型的对象添加为Double,Integer ...