2016-08-04 6 views
7

java.lang.reflect.TypeClass<T> clazzに変換するにはどうすればよいですか?java.lang.reflect.Typeをクラス<T>に変換するclazz

私はClass<T>の引数を持って次のような一つの方法を持っている場合:

public void oneMethod(Class<T> clazz) {  
    //Impl 
} 

その後java.lang.reflect.Typeの引数を持っており、それがoneMethod(Class<T> clazz)を呼び出し、それを私がClass<T>java.lang.reflect.Type typeを変換する必要があり、別の方法:

public void someMehtod(java.lang.reflect.Type type) { 
    // I want to pass type arg to other method converted in Class<T> 
    otherMethod(¿How to convert java.lang.reflect.Type to Class<T>?); 
} 

可能でしょうか?

答えて

6

typeClassのインスタンスであることを確認してから、それをキャストする必要があります。もちろん

if (type instanceof Class) { 
    @SuppressWarnings("unchecked") 
    Class<?> clazz = (Class<?>) type; 
    otherMethod(clazz); 
} 

、あなたはまた、Classでない場合を処理する必要があります。

-1

あなたはこれを意味しましたか?

public <T extends Type> void oneMethod(T clazz) { 

} 

public void someMethod(Type type) { 
    oneMethod(type); 
} 
+1

この問題をメソッド – NatNgs

1

TypeClassより何か他のものであろうと奇妙なだろう... TypeのJavadocは

を言う既知の実装クラスの一覧: クラス

だからない限り、 ClassTypeを使っている特別なライブラリを持っていれば、簡単にキャストすることができますが、できるだけ早く準備する必要がありますClassCastException。 注意:ジェネリックを表現するために、Javaは文書化されていない型の実装を使用します(以下を参照)。

それがチェックされない例外であるため、あなたが明示的にそれを処理したりすることはできません。

明示的な方法:

try { 
    Class<?> clazz = (Class<?>) type; 
} 
catch (ClassCastException ex) { 
    // process exception 
} 

暗黙的な方法:

Class<?> clazz = (Class<?>) type; 

が、現在のメソッドがスローする可能性..


@Andy Turnerのコメントごとに編集:

注意:Type type = new ArrayList<String>().getClass().getGenericSuperclass();は、タイプではなくクラスであるものを生成します。これはParameterizedTypeなので、getRawType()メソッドを使用して実際のクラスを見つけることができますが、他のクラスが存在する可能性があります。

+2

の内部に移動しているだけです。 'Type type = new ArrayList ().getClass()。getGenericSuperclass();'は 'Type'であるが' Class'ではないものを生成する。 [Ideone demo](http://ideone.com/kwdkvj)。 –

+1

@AndyTurner:そうです、それは内部の文書化されていないクラスです。それは 'ParameterizedType'を実装し、' getRawType() 'を使って真のClassを見つけることを推測しなければなりません。 –

+0

@SergeBallesta:それがポイントです。'Type'は' Class'のインスタンスであるか、 'ParameterizedType'、' TypeVariable'、 'WildcardType'、または' GenericArrayType'のインスタンスです。後者の4つはインターフェースです。実装クラスは関係ありません。 – newacct