[java] 자바 : Class.isInstance 대 Class.isAssignableFrom

하자 clazz일부가 될 Classobj일부를 수 Object.

입니다

clazz.isAssignableFrom(obj.getClass())

항상 같은

clazz.isInstance(obj)

?

그렇지 않은 경우 차이점은 무엇입니까?



답변

clazz.isAssignableFrom(Foo.class)clazz객체가 나타내는 클래스가의 수퍼 클래스 또는 수퍼 인터페이스 일 때마다 true 입니다 Foo.

clazz.isInstance(obj)객체 obj가 클래스의 인스턴스 일 때마다 true clazz입니다.

그건:

clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)

너무 오래 항상 사실 clazzobj널이 있습니다.


답변

두 답변 모두 야구장에 있지만 완전한 답변은 아닙니다.

MyClass.class.isInstance(obj)인스턴스를 확인하기위한 것입니다. 매개 변수 obj가 널이 아니고를 MyClass올리지 않고 캐스트 할 수 있으면 true를 리턴합니다 ClassCastException. 즉, obj는 MyClass해당 서브 클래스 의 인스턴스입니다 .

MyClass.class.isAssignableFrom(Other.class)MyClass의 수퍼 클래스 또는 수퍼 인터페이스와 같거나 같으면 true를 반환합니다 Other. Other클래스 또는 인터페이스 일 수 있습니다. Other로 변환 할 수 있으면 true로 응답합니다 MyClass.

보여줄 작은 코드 :

public class NewMain
{
    public static void main(String[] args)
    {
        NewMain nm = new NewMain();
        nm.doit();
    }

    class A { }

    class B extends A { }

    public void doit()
    {
        A myA = new A();
        B myB = new B();
        A[] aArr = new A[0];
        B[] bArr = new B[0];

        System.out.println("b instanceof a: " + (myB instanceof A)); // true
        System.out.println("b isInstance a: " + A.class.isInstance(myB)); //true
        System.out.println("a isInstance b: " + B.class.isInstance(myA)); //false
        System.out.println("b isAssignableFrom a: " + A.class.isAssignableFrom(B.class)); //true
        System.out.println("a isAssignableFrom b: " + B.class.isAssignableFrom(A.class)); //false
        System.out.println("bArr isInstance A: " + A.class.isInstance(bArr)); //false
        System.out.println("bArr isInstance aArr: " + aArr.getClass().isInstance(bArr)); //true
        System.out.println("bArr isAssignableFrom aArr: " + aArr.getClass().isAssignableFrom(bArr.getClass())); //true
    }
}


답변

그 두 가지 결과는 항상 같아야한다고 생각합니다. 차이점은 사용할 클래스의 인스턴스가 필요 isInstance하지만 Class사용할 객체 만 필요하다는 것 isAssignableFrom입니다.


답변

간결하게하기 위해 아래 두 가지 API를 이해할 수 있습니다.

  1. X.class.isAssignableFrom(Y.class)

경우 XY같은 클래스, 또는 X이다 Y‘의 슈퍼 클래스 나 슈퍼 인터페이스를 참, 그렇지 않으면 false를 반환합니다.

  1. X.class.isInstance(y)

말은 y클래스의 인스턴스 인 Y경우 XY같은 클래스, 또는 X이고 Y, 그렇지 않으면 false의 슈퍼 클래스 나 슈퍼 인터페이스는, true를 돌려줍니다.


답변