0

このサイトには似たような質問がたくさんあり、与えられた質問をざっと読んだだけで最初に頭に浮かぶ答えは「いいえ、できません」であるという事実を認識していますが、それでも私は自分が何であるかという印象を持っています尋ねることは決して不可能ではありません。

クラスにジェネリック メソッドを作成しました。メソッドに渡されたオブジェクトの型を確認したいと考えています。直接実行できないことはわかっているため、オブジェクトClass<T>obj をメソッドに渡します。ただし、メソッド本体で型チェックを適切に実行する方法が見つかりません。

public <T> void readData(T obj1, Class<T> obj2){
}   

が常に、またはTの 3 つのタイプのいずれかであると仮定します。if-else-if ブロックはどのように見えるべきですか?ClassAClassBClassC

4

1 に答える 1

0

によって表されるクラスまたはインターフェイスobj2.cast(obj1)にキャストするUseは、がその型に割り当て可能である場合( は任意の型に割り当て可能であることに注意してください) を返し、それ以外の場合はスローします。obj1obj2obj1obj1TnullClassCastException

静的に知られている の型は既にandであるため(キャストが成功した場合)、キャストの結果には関心がありません。ただし、キャストが失敗すると、初期の例外がスローされます。obj1Tobj2.cast(obj1)==obj1

例:

public <T> void readData(T obj1, Class<T> obj2){
 obj2.cast(obj1); 
 //... 
}   

Class<?>次の呼び出し (チェックされていない from からto へのキャストがあるClass<String>場合) は失敗します。

readData("Hello",(Class<String>)(Class<?>)Integer.class);

このメソッドcastは、チェックされていないキャストを置き換える場合にも役立ちます。たとえば、次のようになります。

public <T> void readData(Object obj1, Class<T> obj2){
 T t = (T)obj1;//BAD: unchecked cast
 //...
}


public <T> void readData(Object obj1, Class<T> obj2){
 T t = obj2.cast(obj1());//GOOD: ClassCastException if the cast fails
 //...
}
于 2013-03-17T10:46:12.567 に答える