22

重複の可能性:
Java:InstanceofおよびGenerics

ジェネリックリストを特定のタイプのリストにキャストする関数を作成しようとしています。以下のコードを見つけてください

public <T>List<T> castCollection(List srcList, Class<T> clas){
    List<T> list =new ArrayList<T>();
    for (Object obj : srcList) {
       if(obj instanceof T){
            ...
       }
    }
    return list;
}

しかしobj instanceof T、コンパイルエラーを示しています-

型パラメーターTに対してinstanceofチェックを実行できません。代わりに、その消去オブジェクトを使用してください。実行時にさらにジェネリック型情報が消去されるためです。

望ましい結果を得るための説明や方法はありますか?

前もって感謝します。:)

4

5 に答える 5

40

この方法ではできません。幸いなことに、あなたはすでにClass<T>議論を持っているので、代わりに

myClass.isAssignableFrom(obj.getClass())

objがクラスmyClassまたはサブクラスの場合、これはtrueを返します。

@ILMTitanが指摘したように(ありがとう)、obj == null潜在的なNullPointerExceptionを回避するためにチェックするか、myClass.isInstance(obj)代わりに使用する必要があります。どちらもあなたが必要なことをします。

于 2013-01-09T05:14:57.167 に答える
11

簡単な答え:Javaの型パラメーターは、型の安全性を付与するためにコンパイラーによって使用されるものだからです。

実行時に、ジェネリック型に関する型情報は型消去のために破棄されinstanceofますが、動作するには具体的な型(型変数ではない)が必要な実行時チェックです。

于 2013-01-09T05:15:52.103 に答える
4

Tパラメータ化されたタイプであり、コンパイルの目的で存在します。型消去のため、実行時には存在しません。

したがって、obj instanceof T合法ではありません。

于 2013-01-09T05:13:52.600 に答える
4

javaは消去を使用するため、ジェネリック型を使用してチェックすることはできません。

目的の結果を得るには、を使用しますClass.isInstance()

于 2013-01-09T05:14:38.743 に答える
2

ジェネリック型はコンパイル後に消去され(ジェネリックはコンパイル時の型の安全性のためのものです)、コンパイル後に最も適切な型に置き換えられます。

このコンパイルを行う場合は、Tを具象型に置き換えます。例

obj instance String
于 2013-01-09T05:13:38.100 に答える