我正在尝试使用charts4j
api,其中一个构造函数具有以下功能:
public static Data newData(List<? extends Number> data)
对我来说,它看起来像是某种形式的泛型,但我以前从未见过这种表示法,我也不明白。
我正在尝试使用charts4j
api,其中一个构造函数具有以下功能:
public static Data newData(List<? extends Number> data)
对我来说,它看起来像是某种形式的泛型,但我以前从未见过这种表示法,我也不明白。
这是一个上限通配符: ? extends Number
。
这意味着data
可以是任何事物Number
或子类的列表,例如List<Number>
, List<Integer>
,List<Double>
等。
Java 中的泛型不是协变的,所以 aList<Double>
不是 a List<Number>
。在这里,类型参数List<? extends Number>
允许List<Double>
以及List<Number>
,但类型参数List<Number>
不允许List<Double>
。
至于List
部件,它可以是任何实现的东西List
,例如LinkedList<Integer>
或ArrayList<Double>
。
public static Data newData(List<? extends Number> data)
这定义了一个方法,该方法接收实现List
接口的集合(ArrayList
例如),该集合包含类的任何子Number
类(甚至Number
类本身)。
事实上,这个概念与泛型有关,它被称为上界通配符。长话短说:它允许您编写一个没有特定类型限制的方法,而是一个层次结构限制。
是的,它是泛型中的通配符。这意味着该方法将接受任何扩展 Number 的类类型列表。
例子:List<Integer>, List<Double>
<T extends SomeClass>
当实际参数可以是某个类或它的任何子类时使用。所以在你的情况下:
public static Data newData(List<? extends Number> data)
您的方法可以接受 Number 类型的任何类的列表。
要了解有关 Java 泛型的更多信息,请参阅:
http://docs.oracle.com/javase/tutorial/extra/generics/methods.html
也就是说数据列表只能添加一个Number类型或SubNumber类型的对象,如Double、Integer...
它是一个泛型类型。这意味着该data
参数是任何扩展 Number 的类的列表。即如果你有一个自定义类:
public class Nomber extends number {
//stuff...
}
它将 aList<Nomber>
作为变量。