7

配列リスト内の各オブジェクトの型をチェックする方法についてアルゴリズムをハードコーディングする方法を知っていますが、そのArrayList <>の型を一度にチェックする方法は他にあります。つまり、私のアプリケーションには3種類の配列リストしかないということです。 。ArrayListを返す関数があり、その定義は、変数o(もちろんオブジェクトの配列リスト)にpersonオブジェクトを追加することです。

o.add(person);

オブジェクトの配列リストにすべての個人データを追加しました。この関数を呼び出すと、関数の名前はgetData()と表示されます。

ArrayList <Object> obj = getData();

したがって、getData()の呼び出しから返されたArrayListで、それがすべてpersonオブジェクトであることを知っていますが、そのArrayListのタイプをどのように知ることができますか?

その関数をある意味でより一般的なものにしたかっただけですが、これは私のアプリケーション用ですが、私のアプリケーション全体で天才的です。

これを行う他の方法はありますか、私はアルゴリズムを考えることができますが、これを行うためのショートカットまたは簡単な方法はありますか?..

4

3 に答える 3

10

の「型」などというものはありませんArrayList

このクラスには、参照ArrayListのリストが格納されObjectます。それらがすべて何らかのタイプであるかどうかはわかりませんし、気にもしません。

Java ジェネリック システムは、コンパイル時のチェックを追加して、型を追跡するのに役立ちます。そのため、 を宣言すると、リストArrayList<Person>に non- を挿入できるコードを記述すると、コンパイル エラーが発生Personします。

実行時に の内容を伝える唯一の方法はArrayList、含まれているすべてのアイテムを反復処理して でチェックすることinstanceofです。

于 2012-09-07T15:01:47.313 に答える
4

実際には、すべてのアイテムを手動でキャストしない方法があります (それでも醜いですが..)

//start with an arraylist of unknown generic type
ArrayList <Object> obj = getData();

//Make an array from it(basically the same as looping over the list
// and casting it to the real type of the list entries)
Object[] objArr = obj.toArray();

//Check if the array is not empty and if the componentType of the 
//array can hold an instance of the class Person 
if(objArr.length>0 
    && objArr.getClass().getComponentType().isAssignableFrom(Person.class)) {
    // do sth....
}

これにより、チェックされていない警告が表示されることはありません。

次のように使用できます。

private boolean isArrayOfType(Object[] array,Class<?> aClass) {
    return array.length > 0
            && array.getClass().getComponentType().isAssignableFrom(aClass);
}
Object[] personArr = getData().toArray();
if(isArrayOfType(personArr,Person.class) {
   //Do anything...

}

うまくいかないのは次のとおりです。

// -> This won't work, sry!
       ArrayList<Person> personArrayList = Arrays.asList((Person[])personArr);
于 2015-06-18T13:24:38.807 に答える
3

リストが空でない場合は、最初の要素を取得します。

type = this.list.get(0).getClass().getSimpleName();
于 2019-11-13T19:54:09.587 に答える