我正在尝试使用charts4j
api,其中一个构造函数有:
public static Data newData(List<? extends Number> data)
对我来说,它看起来像某种形式的泛型,但我以前从未见过这种表示法而且我不理解它。
答案 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 ...