我是java语言的新手,并且一直在阅读API文档。我想知道是否有人可以帮助我解决一些符号的含义?例如,在PriorityQueue中有:
Constructor Summary
...
PriorityQueue(Collection<? extends E> c)
...
Method Summary
...
<T> T[]
...
我的问题是'?','E','c'和'T'。我想我已经解决了一些问题,比如'T',我认为是Type。如果有人能帮助理解,我会非常感激。描述网站的链接会很棒!谢谢!
答案 0 :(得分:3)
你是对的,T
是一个类型参数。在这种情况下,它可以被任何类型替换,因为它没有约束。
此构造函数具有类型约束:
PriorityQueue(Collection<? extends E> c)
应该被理解为:使用PriorityQueue
创建一个新的Collection
实例作为类型参数,任何扩展类型E
的类型(包括E
本身),其中E
是PriorityQueue
的类型参数。例如:
List<String> list = new ArrayList<String>();
PriorityQueue<String> pq = new PriorityQueue<String>(list);
在这种情况下,E
(pq
的类型参数)为String
,list
的类型参数与谓词? extends E
匹配,因为它是String
还List<String> list = new ArrayList<String>();
PriorityQueue<Object> pq = new PriorityQueue<Object>(list);
。
这也有效:
String
因为Object
是List<String> list = new ArrayList<String>();
PriorityQueue<Integer> pq = new PriorityQueue<Integer>(list);
的子类,但这在编译时会失败:
{{1}}
我建议您阅读有关Java泛型here的更多信息。
答案 1 :(得分:1)
它们是Java Generics的示例。
具有如下签名的方法:
<T> public T doSomething(T t);
表示可以为任何类替换T.第一部分告诉编译器你要使用T作为通配符,public T只是返回值,而()之间的T是参数的类型。
这意味着您可以调用此方法,如:
final Integer someInt = doSomething(new Integer(5));
但不是这样的:
final Integer someInt = doSomething(new Double(5));
参数和返回值必须相同..
您还可以限制T可以是什么,例如:
<T extends Number> public T doSomething(T t);
然后该方法只能应用于Numer的子类,因此您将拥有:
final Integer someInt = doSomething(new Integer(5)); //allowed
final List someList = doSomething(new List()); //not allowed
?有点相同,当你有“?extends E”时,它意味着任何对象是E(或E本身)的子类。
答案 2 :(得分:0)
你应该学习一些基本的java概念.Stack Overflow的java tag有很多信息。
标记的<? extends E>
表示通配符通用参数,该参数可以是参数化类型扩展集合的任何通用集合。
使用该类时,程序员将替换“参数”E,例如ArrayList<String>
<T>
是通用类声明。
T[]
是数组。
c
是变量声明。