2

私はJava言語が初めてで、APIドキュメントを読んでいます。いくつかの記号の意味について誰かが私を助けることができるかどうか疑問に思っていましたか? たとえば、PriorityQueue には次のものがあります。

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

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

私の問題は、「?」、「E」、「c」、および「T」の周りです。「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);

はのStringサブクラスですObjectが、これはコンパイル時に失敗します。

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

ここでJavaジェネリックについてもっと読むことをお勧めします。

于 2012-09-06T10:43:20.670 に答える
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 自体) である任意のオブジェクトを意味します。

于 2012-09-06T10:46:06.520 に答える
0

いくつかの基本的なJavaの概念を学ぶ必要があります。StackOverflowのJavaタグには多くの情報があります。

タグの<? extends E>意味は、ワイルドカードのジェネリックパラメーターであり、パラメーターは、パラメーター化されたタイプがコレクションを拡張する任意のジェネリックコレクションにすることができます。

「パラメータ」Eは、クラスを使用するときにプログラマーによって置き換えられます。ArrayList<String>

<T>ジェネリッククラス宣言です。

T[]配列です。

c変数宣言です。

于 2012-09-06T11:00:10.463 に答える