ArrayList <Object>内の各オブジェクトのタイプを確認するにはどうすればよいですか?


87

文字列、数値、倍精度浮動小数点数、整数で構成されるデータベースからインポートされたさまざまな要素で構成されるArrayListがあります。リフレクションタイプの手法を使用して、各要素が保持する各データタイプを調べる方法はありますか?

参考:データの種類が非常に多いのは、これが異なるDBで実装されるように記述されたJavaコードの一部であるためです。

回答:


100

C#の場合:Mikeの
推奨により修正されました

ArrayList list = ...;
// List<object> list = ...;
foreach (object o in list) {
    if (o is int) {
        HandleInt((int)o);
    }
    else if (o is string) {
        HandleString((string)o);
    }
    ...
}

Javaの場合:

ArrayList<Object> list = ...;
for (Object o : list) {
    if (o instanceof Integer)) {
        handleInt((Integer o).intValue());
    }
    else if (o instanceof String)) {
        handleString((String)o);
    }
    ...
}

3
実際にはo.GetType()== typeof(int))を使用する代わりに、if(oはint);
マイケルブラウン

そして、もしあなたがたまたまナノ秒について心配しているなら、キャストでの "is"に比べて "as"はいくつかを節約します。
Neil、

47
あなたinstanceofはJavaの場合だけではできませんか?
Razor Storm

2
Integerの場合は、Integer.classでもあるはずですが、Integer.TYPEは機能しません。
アラン、2014

(int) oJavaでは機能しません。エラーメッセージが表示されますCannot cast from Object to int(Integer o).intValue()代わりに使用してください。
最大

54

getClass()メソッドを使用するか、instanceofを使用できます。例えば

for (Object obj : list) {
  if (obj instanceof String) {
   ...
  }
}

または

for (Object obj : list) {
 if (obj.getClass().equals(String.class)) {
   ...
 }
}

instanceofはサブクラスに一致することに注意してください。たとえば、of CはのサブクラスでありA、次のことが当てはまります。

C c = new C();
assert c instanceof A;

ただし、以下は誤りです。

C c = new C();
assert !c.getClass().equals(A.class)


13

次のようなものを使用することはほとんどありません。

Object o = ...
if (o.getClass().equals(Foo.class)) {
    ...
}

可能なサブクラスを考慮していないためです。あなたは本当にClass#isAssignableFromを使いたいです:

Object o = ...
if (Foo.class.isAssignableFrom(o)) {
    ...
}

5

Javaでは、instanceof演算子を使用するだけです。これはサブクラスも処理します。

ArrayList<Object> listOfObjects = new ArrayList<Object>();
for(Object obj: listOfObjects){
   if(obj instanceof String){
   }else if(obj instanceof Integer){
   }etc...
}

5
import java.util.ArrayList;

/**
 * @author potter
 *
 */
public class storeAny {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ArrayList<Object> anyTy=new ArrayList<Object>();
        anyTy.add(new Integer(1));
        anyTy.add(new String("Jesus"));
        anyTy.add(new Double(12.88));
        anyTy.add(new Double(12.89));
        anyTy.add(new Double(12.84));
        anyTy.add(new Double(12.82));

        for (Object o : anyTy) {
            if(o instanceof String){
                System.out.println(o.toString());
            } else if(o instanceof Integer) {
                System.out.println(o.toString());   
            } else if(o instanceof Double) {
                System.out.println(o.toString());
            }
        }
    }
}


3

特定のクラスに依存しない場合、Instanceofは機能しますが、リストにnullを含めることができるため、obj.getClass()は失敗しますが、instanceofは常にnullに対してfalseを返します。


3

Java 8以降


        mixedArrayList.forEach((o) -> {
            String type = o.getClass().getSimpleName();
            switch (type) {
                case "String":
                    // treat as a String
                    break;
                case "Integer":
                    // treat as an int
                    break;
                case "Double":
                    // treat as a double
                    break;
                ...
                default:
                    // whatever
            }
        });


2

を使用object.getClass().getName()する代わりにobject.getClass().getSimpleName()、パッケージ名を含まない単純なクラス名を返すため、を使用できます。

例えば、

Object[] intArray = { 1 }; 

for (Object object : intArray) { 
    System.out.println(object.getClass().getName());
    System.out.println(object.getClass().getSimpleName());
}

与える、

java.lang.Integer
Integer

0

あなたは「これは書かれているJavaコードの一部です」と言っています。それから、別の方法で設計できる可能性はまだあると私は推測しています。

ArrayListを持つことは、もののコレクションを持つようなものです。リストからオブジェクトを取得するたびにinstanceofまたはgetClassを強制するのではなく、DBからオブジェクトを取得するときにオブジェクトのタイプを取得し、適切なタイプのコレクションに格納するようにシステムを設計してみませんかオブジェクト?

または、これを行うために存在する多くのデータアクセスライブラリの1つを使用できます。


0

データが何らかの形で数値であることが予想され、結果に数値を変換することだけに興味がある場合は、次のことをお勧めします。

for (Object o:list) {
  Double.parseDouble(o.toString);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.