web-dev-qa-db-ja.com

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

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

参考:非常に多くの種類のデータがある理由は、これが異なるDBで実装されるように書かれているJavaコードの一部であることです。

87
WolfmanDragon

C#の場合:
マイク からの推奨で修正

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);
    }
    ...
}
99
Frank Krueger

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

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

または

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

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

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

ただし、次は偽になります。

C c = new C();
assert !c.getClass().equals(A.class)
54
faran
for (Object object : list) {
    System.out.println(object.getClass().getName());
}
45
Fabian Steeg

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

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

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

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

Javaでは、instanceof演算子を使用します。これにより、サブクラスも処理されます。

ArrayList<Object> listOfObjects = new ArrayList<Object>();
for(Object obj: listOfObjects){
   if(obj instanceof String){
   }else if(obj instanceof Integer){
   }etc...
}
5
Reid Mac
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());
            }
        }
    }
}
5
potter

ループ内の各Object.getClass()を呼び出すだけです。

残念ながら、Javaにはmap()がありません。 :)

4
skiphoppy

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
            }
        });
3
Andrey

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

3
John Gardner

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
2
Sufiyan Ghori

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

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

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

0
shoover

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

for (Object o:list) {
  Double.parseDouble(o.toString);
}
0
DJClayworth