2011-06-28 9 views
4

のJava APIがあります:いくつかのいずれかが、何<T> T and Class<T>手段を説明することができJavaジェネリックスの解釈方法<T> T、<T,V>クエリ<T>、クラス<T>?

<T> T fromDBObject(Class<T> entityClass, com.mongodb.DBObject dbObject) 

Morphia

クラスMorphiaは次のようにメソッドを定義しますか?このメソッドはコレクション内でT型のクラスを返していますか?

intefaceをデータストア上の別のAPI:

<T,V> Query<T> find(Class<T> clazz, String property, V value) 

What <T,V> Query<T> means? Is the method returning an object of type Query that is then surrounded by collection `<T,V>` and `<T>`. This part is very confusing. 

はアングルブラケット(< >)が関与している時はいつでも、それが正しいと言うことです、それは常にJavaのコレクションが関与していること?

申し訳ありませんが、この問題のコンテンツをコードとしてマークするのを忘れてしまったのですが、SOは質問全体の意味を変更してエスケープしていたため、@Vashと@fiverの2つの回答はこの編集前の質問に従います。

いくつかのチュートリアルを参照していただきありがとうございますが、Javaジェネリックスの専門知識から具体的な答えを質問に提供してください。

+0

多くのジェネリックチュートリアルがありますが、それは読んでください。 – Dorus

答えて

3

<>が表示されている場合は、コレクションではなくジェネリッククラスを意味します。宣言でhttp://download.oracle.com/javase/6/docs/api/java/lang/Class.html

Tは(Tタイプである)は、任意のタイプのオブジェクトを意味する:

クラスは、一般的なクラスの一例です。

DBFromObjectメソッドはジェネリックメソッドです。ジェネリックタイプはTで表され、このジェネリックタイプTのオブジェクトを返し、Class<T>というパラメータを受け取ります。

+0

fromDBObjectメソッドの戻り部分には、とTの違いは何ですか? ? – didxga

+0

は、この宣言に対してあなたの未知の型に与えたい名前を指定します。関数の戻り値の型。 ' List SomeFunction(Tパラメータ){戻り値はnullです。 } ' –

+0

String.classとして最初の引数を渡してこのメ​​ソッドを呼び出す場合、返す部分は文字列と考えることができますが、奇妙に思えますが、返す部分は宣言する必要がありますTとは違いますか? – didxga

0

QueryおよびClassはJavaクラスです。

<T>は、いくつかの汎用パラメータTが使用されることを意味します。

tutorialをお読みください。これがジェネリックを明確にします。

5

ジェネリックスはコレクションに限定されませんが、コレクションはジェネリックスが必要な理由とその使用方法を理解する良い例です。

新しいListオブジェクトを作成し、そのオブジェクトには特定の種類のオブジェクト(たとえば、MyClassオブジェクト)のみが含まれているとします。何らかの形であなたのコードでそれを指定することができ、自動的にチェックすることができれば、他のタイプのオブジェクトがこのリストに挿入されないようにすることができます。さらに、他の開発者があなたのコードを読んだとき、彼らはこのリストに `MyClass 'オブジェクトだけが含まれていることを容易に理解します。

ジェネリックスでは、Listクラスを書き換えずに、このような情報をコードに含めることができます。実際には、Listの機能は、それが含むオブジェクトの種類から独立しています。

  List<MyClass> myList = new List<MyClass>(); 

は今、あなたは、複数のジェネリック型を指定することができる場合を想像することができますので、あなたは、このコードを書い List独自に作成します。この場合の良い例は、 Mapクラスです。キーと値のタイプを定義することができます。したがって、 Mapクラス宣言( Map<K,V>)に <K,V>が表示されます。

クラスに加えて、ジェネリックをメソッド/コンストラクタ宣言で使用することもできます。あなたの例では:

  <T,V> Query<T> find(Class<T> clazz, String property, V value) 

2つのジェネリック型TとVを持っており、あなたがそれらを指定することができます(または、彼らは、コンパイラによって推測することができます)あなたがメソッドを呼び出したときに方法があります。ここで、宣言の<T,V>は、このメソッドの機能を明示的に示します。

+0

の意味を正確に説明できますか?このメソッドは、キーがT型で、値がV型であるコレクション・マップ内のQuery型のオブジェクトを戻していますか? – ace

+2

クエリを返します。それはコレクションとは関係ありません。 は、メソッドに2つのジェネリックタイプTとVがあることを示しています。そのうちの1つはクエリおよびクラスにあり、もう1つは引数タイプ(V値)として表示されました。 –

0

public <T> T fromDBObject(Class<T> entityClass, com.mongodb.DBObject dbObject)は、Class Literals as Runtime-Type Tokensの良い例です。宣言は、pageの下部にある例に非常に似ています。一つの読書は、entityClassdbObjectという名前のTタイプのクラスリテラル、Tタイプのオブジェクトを返すfromDBObject()方法を考える」、であるかもしれない。この場合、Classオブジェクトというタイプの略シンボルT

関連する問題