2010-04-16 3 views

답변

76
if (x instanceof Collection<?>){ 
} 

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

거기에'? '가 들어 있습니다. 삭제 된 구성 요소 유형에는 액세스 할 수 없습니다. 컬렉션에 포함될 수있는 개체의 종류를 알아야 할 경우 요소 자체를 살펴볼 필요가 있습니다. – Thilo

+1

요소가 없을 때 어떤 종류의 개체가 컬렉션에 있는지 찾으려면 어떻게해야합니까? – MichalH

1

instanceof에 대해 어떻게 생각하세요? , 그것이 그러나 대부분 "유형 상승 소위"에 대한 순수한 OOP 스타일 사용되지는 않지만 등이

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

을 말한다.

+5

새 코드에서 원시 형식을 사용하지 마십시오. – polygenelubricants

+1

저 같은 오래된 개발자는 언젠가 제네릭 표기법이 아무런 가치를 추가하지 않을 때, 언젠가 저와 같은 컴파일 할 수없는 예를 위해 pre-java1.5 표기법을 사용하는 경향이 있습니다. – Riduidel

+0

추가 된 값은 명시 적으로 유형을 알 수 없다는 것입니다. 이 정보를 1.5 이전 표기법으로 전달할 수있는 방법은 없습니다. – Max

3

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

37

업데이트 : 객체가있는 경우

  1. 당신이 결정할 : 여기에 두 가지 시나리오가 있습니다 수집;

  2. 클래스가 콜렉션인지 여부가 결정됩니다.

해결 방법은 약간 다르지만 원칙은 동일합니다. 또한 "컬렉션"을 정확히 구성해야합니다. Collection 또는 Map 중 하나를 구현하면 Java Collections를 다룰 수 있습니다.

해결 방법 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()); 
} 

나는 생각하지 않는다 두 방법의 효율성은 다른 방법과 크게 다를 것입니다.

+0

왜 "instanceof"를 사용하지 않습니까? – Thilo

+0

그쪽 업무에 합류 한 사람은 "instanceof"없이 쓸쓸 해 질 수 있습니다. –

+0

@cletus : 좋은 결정입니다. 감사. –

4

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<?>는-A 것을 Collection<?>, 그래서 첫 번째 테스트를 통과 것이며, else는 두 번째 테스트에 도달하지 않습니다 것을 의미한다 : 즉, 다음과 같은 코드가 작동하지 않는 것입니다. 가장 일반적인 유형 인까지 테스트해야합니다.

+1

지도가 Collection을 확장하지 않습니다. – Thilo

+2

@Thilo : brainfarted; 'List'로 수정되었습니다. 중요한 점은 여전히 ​​있습니다. – polygenelubricants

12

질문에 반성을 언급 한 이래로;

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

우수 답변은 여기 IMO – Madbreaks

관련 문제