2013-04-08 19 views

答えて

29

readObjectDataメソッドは、1つのタイプパラメータTで一般的に宣言されています。

public <T> ... 

戻り値の型はTです。ジェネリック型宣言で初期<T>なし

... T readObjectData(... 

、シンボルTは未定義になります。

パラメータリストでは、Class<T> typeがパラメータの1つです。戻り値の型とこのパラメータは両方ともTを参照するため、Class<String>を渡すと、Stringが返されます。 Class<Double>を渡すと、Doubleが返されます。

パラメータを渡すには、Classオブジェクトを渡します。 String.class

20

<T>部分は、Tという汎用型引数を宣言しています。この部分を省略すると、コンパイラはタイプTが存在しないと不平を言う可能性があります。

この場合、Tは、実際の型のプレースホルダとして機能します。実際の型は、メソッドが非ジェネリック型の引数で実際に呼び出されたときにのみ決定されます。

public <T> T readObjectData(... 
     ^^ 
     | + Return type 
     + Generic type argument 
12

<T>は、パラメータクラスです。 Tという名前のクラスはありません。このメソッドは、typeという名前の2番目のメソッド引数で指定されたクラスで使用できます。

方法は、以下のように定義されているので:

public <T> T readObjectData(ByteBuffer buffer, Class<T> type)

あなたのようにそれを呼び出すことができ、以下の書かれた:

MyClass obj = o.readObjectData(buffer, MyClass.class);

あなたがの戻り値をキャストする必要はありません注意してください。 readOjectData()~MyClass。むかしむかし、Java 5の前に、このメソッドは以下のように定義されます:

public Object readObjectData(ByteBuffer)

とその使用法は次のように見えた:鋳造ので

MyClass obj = (MyClass)o.readObjectData(buffer);

ClassCastExceptionこれは悪い習慣である可能性があります。これがジェネリック医薬品の発明の理由でした。

0

あなたはおそらく同様の、より一般的な宣言で混乱している:上記の場合

class MyClass<T> { 
    private T myMethod(T a){ 
     return a; 
    } 
} 

それは使用していますTが同じであるため、プライベート(private <T> T myMethod(T a)

"<T>"のための必要はありませんクラスで定義されているものよりもMyClass<T>

さらに書くと、

class MyClass<T> { 
    private <T> T myMethod(T a){ 
     return a; 
    } 
} 

意味は、myMethodの戻り値の型が(潜在的に)MyClass型と異なることです。

class MyClass<T1> { 
    private <T2> T2 myMethod(T2 a){ 
     return a; 
    } 
} 

クレジット:あなたはこの代わりに書いたかのようにHow to use Class<T> in Java?

に長い答えの "Kanagavelu Sugumar」から例を取りました
関連する問題