Development Tip

객체가 Java에서 컬렉션 유형인지 확인하는 방법은 무엇입니까?

yourdevel 2020. 11. 29. 12:23
반응형

객체가 Java에서 컬렉션 유형인지 확인하는 방법은 무엇입니까?


자바 리플렉션을 사용하면 객체가 배열인지 쉽게 알 수 있습니다. 개체가 컬렉션 (Set, List, Map, Vector ...)인지 확인하는 가장 쉬운 방법은 무엇입니까?


if (x instanceof Collection<?>){
}

if (x instanceof Map<?,?>){
}

업데이트 : 여기에 두 가지 가능한 시나리오가 있습니다.

  1. 개체가 컬렉션인지 확인합니다.

  2. 클래스가 컬렉션인지 확인하고 있습니다.

솔루션은 약간 다르지만 원칙은 동일합니다. "컬렉션"을 정확히 구성하는 항목도 정의해야합니다. Collection또는 구현 Map은 Java 컬렉션을 다룹니다.

해결책 1 :

public static boolean isCollection(Object ob) {
  return ob instanceof Collection || ob instanceof Map;
}

해결책 2 :

public static boolean isClassCollection(Class c) {
  return Collection.class.isAssignableFrom(c) || Map.class.isAssignableFrom(c);
}

(1)은 (2) 측면에서도 구현할 수 있습니다.

public static boolean isCollection(Object ob) {
  return ob != null && isClassCollection(ob.getClass());
}

나는 두 방법의 효율성이 다른 방법과 크게 다를 것이라고 생각하지 않습니다.


질문에서 성찰을 언급 했으므로;

boolean isArray = myArray.getClass().isArray();
boolean isCollection = Collection.class.isAssignableFrom(myList.getClass());
boolean isMap = Map.class.isAssignableFrom(myMap.getClass());

Java 에는 주어진 객체가 주어진 유형인지 테스트 하는 instanceof연산자 ( JLS 15.20.2 )가 있습니다.

 if (x instanceof List<?>) {   
    List<?> list = (List<?>) x;
    // do something with list
 } else if (x instanceof Collection<?>) {
    Collection<?> col = (Collection<?>) x;
    // do something with col
 }

여기서 한 가지 언급해야합니다. 이러한 종류의 구조에서 올바른 순서로 확인하는 것이 중요 합니다. 위의 스 니펫에서 검사 순서를 바꾼 경우 코드는 계속 컴파일되지만 더 이상 작동하지 않습니다 . 다음 코드가 작동하지 않습니다.

 // DOESN'T WORK! Wrong order!
 if (x instanceof Collection<?>) {
    Collection<?> col = (Collection<?>) x;
    // do something with col
 } else if (x instanceof List<?>) { // this will never be reached!
    List<?> list = (List<?>) x;
    // do something with list
 }

문제는 List<?>is-a Collection<?>이므로 첫 번째 테스트를 통과 else하고 두 번째 테스트에 도달하지 않는다는 의미입니다. 가장 구체적인 유형부터 가장 일반적인 유형까지 테스트해야합니다 .


객체가 java.util.Collection또는을 구현하는지 테스트합니다 java.util.Map. ( Map의 하위 인터페이스가 아니기 때문에 별도로 테스트해야합니다 Collection.)


사용에 대해 생각해 보셨습니까 instanceof? 마치

if(myObject instanceof Collection) {
     Collection myCollection = (Collection) myObject;

순수한 OOP 스타일은 아니지만 소위 "유형 에스컬레이션"에 주로 사용됩니다.

참고 URL : https://stackoverflow.com/questions/2651632/how-to-check-if-an-object-is-a-collection-type-in-java

반응형