ArrayList <Object>에서 각 개체가 어떤 유형인지 어떻게 알 수 있습니까?


87

DB에서 가져온 여러 요소로 구성된 ArrayList가 있으며 문자열, 숫자, double 및 int로 구성됩니다. 리플렉션 유형 기술을 사용하여 각 요소가 보유하는 각 데이터 유형을 알아내는 방법이 있습니까?

참고 : 데이터 유형이 너무 많은 이유는 이것이 다른 DB로 구현되도록 작성되는 자바 코드 조각이기 때문입니다.

답변:


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

자바 :

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 is int);
Michael Brown

그리고 만약 당신이 매 나노초에 대해 걱정한다면, "as"는 캐스트가있는 "is"에 비해 당신을 약간 절약 할 것입니다.
Neil

47
instanceof자바 케이스에서 할 수 없습니까 ?
Razor Storm

2
Integer의 경우 Integer.class도되어야하며 Integer.TYPE이 작동하지 않습니다.
alan turing 2014 년

(int) oJava에서 작동하지 않습니다. 오류 메시지가 생성 Cannot cast from Object to int됩니다. (Integer o).intValue()대신 사용하십시오 .
Max

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)

45
for (Object object : list) {
    System.out.println(object.getClass().getName());
}

7
목록에서 가능한 경우 null을 잊지 마십시오. 이 예제에서 null이있는 NullPointerExceptions를 얻을 수 있습니다.
John Gardner

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());
            }
        }
    }
}

4

루프 .getClass()에서 각각 Object을 호출하십시오 .

불행히도 Java에는 map(). :)


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

"이것은 작성중인 자바 코드의 일부입니다"라고 말하면 다른 방식으로 설계 할 수있는 가능성이 여전히 있다고 생각합니다.

ArrayList를 갖는 것은 물건 모음을 갖는 것과 같습니다. 목록에서 객체를 가져올 때마다 instanceof 또는 getClass를 강제하는 대신 DB에서 객체를 검색 할 때 객체 유형을 가져 와서 적절한 유형의 컬렉션에 저장하도록 시스템을 설계하는 것이 좋습니다. 목적?

또는 존재하는 많은 데이터 액세스 라이브러리 중 하나를 사용하여이를 수행 할 수 있습니다.


0

데이터가 어떤 형태로든 숫자가 될 것으로 예상하고 결과를 숫자 값으로 변환하는 데 관심이 있다면 다음을 제안합니다.

for (Object o:list) {
  Double.parseDouble(o.toString);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.