Java에 instanceOf (Class <?> c)와 같은 것이 있습니까?


87

객체 o가 클래스의 인스턴스 C인지 또는의 하위 클래스 인지 확인하고 싶습니다 C.

예를 들어, 만약 p클래스입니다 Point내가 원하는 x.instanceOf(Point.class)것으로 truex.instanceOf(Object.class)true.

boxed primitive 유형에서도 작동하기를 원합니다. 예를 들어, 만약 x인은 Integer다음 x.instanceOf(Integer.class)되어야한다 true.

그런 것이 있습니까? 그렇지 않다면 어떻게 그러한 방법을 구현할 수 있습니까?


박스 클래스를 처리하는 것은 약간의 혼란입니다
DFA

답변:


172

Class.isInstance 는 원하는 작업을 수행합니다.

if (Point.class.isInstance(someObj)){
    ...
}

물론, instanceof대신 사용할 수 있다면 사용해서는 안되지만 반사 시나리오에서는 종종 유용합니다.


6
@Ahamed 아마 더 느리지 만 더 나쁜 것은 이해하기가 더 어렵다는 것입니다! 뭔가를 할 수있는 아주 간단한 방법이 있는데- if (a instanceof Point)당신이 좀 더 복잡한 방법으로한다면, 코드를 읽는 사람은 누구나 "오,이 일이 어려운 방법으로 행해지는 이유가 있어야합니다"라고 생각하게됩니다. 그런 다음 문서로 이동 Class.isInstance하여 instanceof. 동료의 시간을 낭비합니다.
gustafc 2014-08-25

21

객체 o가 클래스 c의 인스턴스인지 또는 c의 하위 클래스인지 확인하고 싶습니다. 예를 들어, p가 Point 클래스이면 x.instanceOf (Point.class)

음 ... 뭐? o, p 및 x는 무엇입니까?

기본 유형에서도 작동하기를 원합니다. 예를 들어 x가 정수이면 x.instanceOf (Integer.class) 및 x.instanceOf (Object.class)도 true 여야합니다.

아니요. 컴파일도 안됩니다. 프리미티브는 객체가 아니며 이에 대한 메서드를 호출 할 수 없습니다.

어쨌든 세 가지가 있는데, 그 중 하나는 원하는 것을 확실히 달성 할 수 있습니다.

  • instanceof연산자는 컴파일시에 클래스를 알고있는 경우.
  • Class.isInstance () 컴파일 타임에 알려지지 않은 클래스에 대해 객체의 클래스를 확인하려는 경우.
  • Class.isAssignableFrom () 두 개의 클래스 객체가 주어진 할당 가능성을 확인하려는 경우.

9
x instanceof Integer
x instanceof Object

올바른 구문을 사용해야합니다.

primitve 유형의 경우 완전히 다르게해야합니다. 메서드를 만들 수 없기 때문에 메서드를 유지하는 클래스가 필요합니다. 따라서 "x.instanceOf (Integer.Class)"대신 "MyClassComparer.instanceOf (x, Integer.Class)"또는 이와 유사한 것을 호출해야합니다. 이것은 메서드를 오버로딩하여 쉽게 구현할 수 있지만 그 기능이 전혀 필요하지 않은 경우를 보지 못했습니다.


4

사실 Java에는 객체가 클래스의 인스턴스인지, 서브 클래스의 인스턴스인지, 특정 인터페이스를 구현하는 클래스의 인스턴스인지 결정하는 데 사용할 수있는 instanceof라는 부울 연산자가 있습니다.

if(obj instanceof SomeClass) {
    // Do something
}

Java Tutorial에는 이 연산자 의 좋은 예가 있습니다.


1
기본 유형에는 instanceof를 사용할 수 없습니다
dfa 2009-06-04

4
그는 원시 유형을 객체와 혼동했습니다. 읽어보십시오 ... "예를 들어, x가 정수이면 x.instanceOf (Integer.class) 및 x.instanceOf (Object.class)도 참이어야합니다." 부끄러운 모든 해답을-투표
휴고 빅터

Seconding (sp) Java Tutorial 사용 제안. 언어 자체를 배우는 데 좋은 참고 자료입니다.
luis.espinal 2010

0

넌 할 수있어:

if (foo instanceof classNameYouWantToCheck) 

기본 유형에는 instanceof를 사용할 수 없습니다
dfa 2009-06-04

수업은 그가 거기에 수업 이름을 써야한다는 것을 보여주기위한 것이었다. 나는 그것을 고칠거야
fmsf

0

"기본 유형에서도 작동하기를 원합니다. 예를 들어 x가 정수이면 x.instanceOf (Integer.class) 및 x.instanceOf (Object.class)도 true 여야합니다."

왜? 기본 유형과 참조 유형은 완전히 별개입니다. 기본 int는 Integer 또는 Object의 하위 유형이 아닙니다. 프리미티브 값의 유형은 컴파일 타임에 항상 정적으로 알려져 있으므로 해당 유형을 테스트 할 필요가 없습니다. 물론, 기본 값을 상자에 넣은 다음 해당 유형을 테스트 할 수 있습니다.

(Integer)5 instanceof Integer

그러나 요점은 무엇입니까?


-2

나는 당신이 원시 객체와 일반 객체에 대한 instanceof에 대해 혼란스러워한다고 생각합니다.

obj instanceof Class
obj instanceof Class<?> // this is the one you want

2
유형 삭제로 인해 instanceof 연산자의 오른쪽에 제네릭을 사용할 수 없습니다.
Matthias 2016

2
아니, 그것에 대해 혼란스러운 것은 당신 입니다. 이후 원시 유형을 사용해야합니다 instanceof.
Dawood ibn Kareem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.