2016-11-19 10 views
1

どのように型パラメータオブジェクトのクラス名を取得しますか?バインドされたジェネリック型のパラメータクラスを引数として渡す方法

例:関数が

public <T extends Base> void convert(final T arg) {} 
public <T> void method2(Class<T> typeParamClass) {} 

であるかどうかはどのようにメソッド2からClass<T>としてargを渡すのですか?私はarg.getClassを(合格しよう

エラーメッセージ)

実際のコードスニペット

static <T> byte[] method2(T object, final Class<T> typeParameterClass) throws SerializationException { 
} 


static <T> T method3(final byte[] serializedObject, final Class<T> typeParameterClass) throws SerializationException { 
     return (T) serializer.deserialize(typeParameterClass, Buffers.toBuffer(serializedObject)); 
    } 
} 

public static <T> T clone(final T object) { 
    return method3(method2(object, object.getClass()), object.getClass()); 
} 

enter image description here

+0

** ** ** *他の方法は何ですか? –

+0

@ user3089214:[mcve]を入力してください。 –

+2

'method2'は型パラメータを宣言するのがなぜですか?ここには意味がないようです。 –

答えて

3
public <T> void method2(Class<T> typeParamClass) 

あなたは第2の方法は、一般的な作る場合、あなたができるようになりますそれを呼び出すように

public <T extends Base> void convert(final T arg) { 
    method2(arg.getClass()); 
} 

method2T extends Object)にはTの制限事項がありません。したがってTT extends Baseを含む)は自由に渡すことができます。

Sotirios Delimanolisが指摘したように、Tはここで本当に意味がないとメソッドは単純に定義することができます。

public void method2(Class<?> typeParamClass) 

UPDATE:

method2(object, object.getClass()) 
         ^^^ 

ここでの主な問題は、getClass()が仮想であるということですメソッドは、インスタンスの実行時の型を返します。指定されたTからClass<T>を返すことは保証できませんが、? extends Tできます。コンパイルするには、署名を次のように変更する必要があります。

method2(T object, final Class<? extends T> typeParameterClass) 
           ^^^ 
+0

method2の正しい署名で質問を更新しました。私はmethod2シグニチャとmethod2(arg.getClass())を変更することはできません。は動作していません – user3089214

+1

@ user3089214:どうしてうまくいかないのですか?このテストケースでは動作するようです:http://ideone.com/itdAIU –

+0

Gettinrエラー(java.lang.Class )は(java.lang.Class >) – user3089214

関連する問題