객체가 Java에서 컬렉션 유형인지 확인하는 방법은 무엇입니까?
자바 리플렉션을 사용하면 객체가 배열인지 쉽게 알 수 있습니다. 개체가 컬렉션 (Set, List, Map, Vector ...)인지 확인하는 가장 쉬운 방법은 무엇입니까?
if (x instanceof Collection<?>){
}
if (x instanceof Map<?,?>){
}
업데이트 : 여기에 두 가지 가능한 시나리오가 있습니다.
개체가 컬렉션인지 확인합니다.
클래스가 컬렉션인지 확인하고 있습니다.
솔루션은 약간 다르지만 원칙은 동일합니다. "컬렉션"을 정확히 구성하는 항목도 정의해야합니다. 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
'Development Tip' 카테고리의 다른 글
Hibernate Criteria를 사용하는 경우 대소 문자를 구분하지 않음 (0) | 2020.11.29 |
---|---|
클릭하여 HTML 링크를 활성화하는 방법 (0) | 2020.11.29 |
두 개의 STL 맵을 병합하려면 어떻게해야합니까? (0) | 2020.11.29 |
Java에서 문자열의 첫 번째 문자가 정규식없이 대문자인지 확인하는 방법 (0) | 2020.11.29 |
Q_OBJECT에서 'vtable에 대한 정의되지 않은 참조'오류 발생 (0) | 2020.11.29 |