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

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

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

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

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



답변

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

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

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


답변

객체 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 () 두 개의 클래스 객체가 주어진 할당 가능성을 확인하려는 경우.


답변

x instanceof Integer
x instanceof Object

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

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


답변

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

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

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


답변

넌 할 수있어:

if (foo instanceof classNameYouWantToCheck)


답변

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

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

(Integer)5 instanceof Integer

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


답변

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

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