자바 리플렉션을 사용하여 객체가 배열인지 쉽게 알 수 있습니다. 객체가 콜렉션인지를 확인하는 가장 쉬운 방법은 무엇입니까? (Set, List, Map, Vector ...)?오브젝트가 Java의 콜렉션 유형인지 확인하는 방법은 무엇입니까?
답변
if (x instanceof Collection<?>){
}
if (x instanceof Map<?,?>){
}
instanceof
에 대해 어떻게 생각하세요? , 그것이 그러나 대부분 "유형 상승 소위"에 대한 순수한 OOP 스타일 사용되지는 않지만 등이
if(myObject instanceof Collection) {
Collection myCollection = (Collection) myObject;
을 말한다.
새 코드에서 원시 형식을 사용하지 마십시오. – polygenelubricants
저 같은 오래된 개발자는 언젠가 제네릭 표기법이 아무런 가치를 추가하지 않을 때, 언젠가 저와 같은 컴파일 할 수없는 예를 위해 pre-java1.5 표기법을 사용하는 경향이 있습니다. – Riduidel
추가 된 값은 명시 적으로 유형을 알 수 없다는 것입니다. 이 정보를 1.5 이전 표기법으로 전달할 수있는 방법은 없습니다. – Max
개체가 java.util.Collection
또는 java.util.Map
을 구현하는지 테스트합니다. (Map
는 Collection
의 하위 인터페이스가 아니기 때문에 별도로 테스트해야합니다.)
업데이트 : 객체가있는 경우
당신이 결정할 : 여기에 두 가지 시나리오가 있습니다 수집;
클래스가 콜렉션인지 여부가 결정됩니다.
해결 방법은 약간 다르지만 원칙은 동일합니다. 또한 "컬렉션"을 정확히 구성해야합니다. 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());
}
나는 생각하지 않는다 두 방법의 효율성은 다른 방법과 크게 다를 것입니다.
왜 "instanceof"를 사용하지 않습니까? – Thilo
그쪽 업무에 합류 한 사람은 "instanceof"없이 쓸쓸 해 질 수 있습니다. –
@cletus : 좋은 결정입니다. 감사. –
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
는 두 번째 테스트에 도달하지 않습니다 것을 의미한다 : 즉, 다음과 같은 코드가 작동하지 않는 것입니다. 가장 일반적인 유형 인까지 테스트해야합니다.
지도가 Collection을 확장하지 않습니다. – Thilo
@Thilo : brainfarted; 'List'로 수정되었습니다. 중요한 점은 여전히 있습니다. – polygenelubricants
질문에 반성을 언급 한 이래로;
boolean isArray = myArray.getClass().isArray();
boolean isCollection = Collection.class.isAssignableFrom(myList.getClass());
boolean isMap = Map.class.isAssignableFrom(myMap.getClass());
우수 답변은 여기 IMO – Madbreaks
- 1. php 버전 5.2.9에서 파일이 이미지인지 비디오 유형인지 확인하는 방법은 무엇입니까?
- 2. 문자가 Java의 문자인지 확인하는 방법은 무엇입니까?
- 3. 캔버스 위젯에 두 개의 오브젝트가 겹쳐져 있는지 확인하는 방법은 무엇입니까?
- 4. 숫자가 java의 기본 유형에 맞는지 확인하는 방법은 무엇입니까?
- 5. 루아에게 전달 된 매개 변수가 사용자 정의 유형인지 확인하는 방법은 무엇입니까?
- 6. Java : 콜렉션 임의 콜렉션 컬렉션을 통한 콜렉션
- 7. 파이썬 스레드 가비지 콜렉션
- 8. C#에서 변수가 값 유형인지 어떻게 테스트해야합니까?
- 9. 운영체제를 확인하는 방법은 무엇입니까?
- 10. null인지 확인하는 방법은 무엇입니까?
- 11. 여권을 확인하는 방법은 무엇입니까?
- 12. LDIF를 확인하는 방법은 무엇입니까?
- 13. 메소드가 Java에서 콜렉션 <Foo>을 리턴하는지 확인하는 방법은 무엇입니까?
- 14. 사용할 수있는 콜렉션 유형은 무엇입니까?
- 15. 변수를 사용하여 콜렉션 정의
- 16. object가 linq 유형의 SQL인지 확인하는 방법
- 17. 새 오브젝트가 추가 될 때 벡터에서 오브젝트가 삭제됩니다.
- 18. 오브젝트가 Comparable을 구현하는지 확인하십시오.
- 19. LocalJumpError의 출처를 확인하는 방법은 무엇입니까?
- 20. 파일이 PHP인지 확인하는 방법은 무엇입니까?
- 21. IO.popen이 성공했는지 확인하는 방법은 무엇입니까?
- 22. ASP.net의 버전을 확인하는 방법은 무엇입니까?
- 23. EditView에서 비밀번호를 확인하는 방법은 무엇입니까?
- 24. QAction의 출처를 확인하는 방법은 무엇입니까?
- 25. 이미지가 선택되었는지 확인하는 방법은 무엇입니까?
- 26. Linux에서 이더넷을 확인하는 방법은 무엇입니까?
- 27. UIView에서 방향을 확인하는 방법은 무엇입니까?
- 28. 양식이 최대화되었는지 확인하는 방법은 무엇입니까?
- 29. oledbcommand가 성공했는지 확인하는 방법은 무엇입니까?
- 30. 네트워크 가용성을 확인하는 방법은 무엇입니까?
거기에'? '가 들어 있습니다. 삭제 된 구성 요소 유형에는 액세스 할 수 없습니다. 컬렉션에 포함될 수있는 개체의 종류를 알아야 할 경우 요소 자체를 살펴볼 필요가 있습니다. – Thilo
요소가 없을 때 어떤 종류의 개체가 컬렉션에 있는지 찾으려면 어떻게해야합니까? – MichalH