2

我是 Java 语言的新手,并且一直在阅读 API 文档。我想知道是否有人可以帮助我了解某些符号的含义?例如,在 PriorityQueue 中有:

Constructor Summary
...
PriorityQueue(Collection<? extends E> c)
...

Method Summary
...
<T> T[]
...

我的问题是围绕'?','E','c'和'T'。我想我已经解决了一些问题,比如我认为是 Type 的“T”。如果有人可以帮助理解我会非常感激。一个描述网站的链接会很棒!谢谢!

4

3 回答 3

3

你是对的,这T是一个类型参数。在这种情况下,它可以被任何类型替换,因为它没有约束。

这个构造函数有一个类型约束:

PriorityQueue(Collection<? extends E> c)

并且应该被理解为:使用作为类型参数的任何类型来创建一个新实例,该类型扩展了该类型(PriorityQueue包括其自身),其中. 例子:CollectionEEEPriorityQueue

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);

sinceString是 的子类Object,但这会在编译时失败:

List<String> list = new ArrayList<String>();
PriorityQueue<Integer> pq = new PriorityQueue<Integer>(list);

我建议您在此处阅读有关 Java 泛型的更多信息。

于 2012-09-06T10:43:20.670 回答
1

它们是 Java 泛型的示例。

带有这样签名的方法:

<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

这 ?有点相同,当您有“?扩展 E”时,它表示任何作为 E 子类(或 E 本身)的对象。

于 2012-09-06T10:46:06.520 回答
0

你应该学习一些基本的java概念。Stack Overflow的java标签有很多信息。

该标记的<? extends E>意思是通配符泛型参数,该参数可以是参数化类型扩展集合的任何泛型集合。

“参数” E 在使用类时由程序员替换,例如ArrayList<String>

<T>是通用类声明。

T[]是数组。

c是变量声明。

于 2012-09-06T11:00:10.463 回答