source

java: Class.isInstance와 Class.isAssignableFrom

goodcode 2022. 8. 12. 23:22
반응형

java: Class.isInstance와 Class.isAssignableFrom

허락하다clazz대단하다Class그리고.obj대단하다Object.

clazz.isAssignableFrom(obj.getClass())

항상 똑같다

clazz.isInstance(obj)

?

그렇지 않으면 어떤 차이가 있습니까?

clazz.isAssignableFrom(Foo.class)에 의해 대표되는 클래스가 항상 참이 될 것이다.clazzobject는 슈퍼클래스 또는 슈퍼인터페이스입니다Foo.

clazz.isInstance(obj)대상이 될 때마다 진실이 될 것이다.obj클래스의 인스턴스입니다.clazz.

즉, 다음과 같습니다.

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

이라면 언제나 진실이다clazz그리고.objnull이 아닙니다.

두 답변 모두 대략적인 수준이지만 둘 다 완전한 답변은 아니다.

MyClass.class.isInstance(obj)인스턴스 체크용입니다.매개 변수 obj가 null이 아닌 경우 true를 반환하고 다음 주소로 캐스트할 수 있습니다.MyClass한 푼도 올리지 않고ClassCastException바꿔 말하면, obj는,MyClass또는 그 서브클래스.

MyClass.class.isAssignableFrom(Other.class)만약 그렇다면 실현될 것이다.MyClass슈퍼클래스 또는 슈퍼인터페이스와 같거나 슈퍼클래스 또는 슈퍼인터페이스입니다.Other.Other클래스 또는 인터페이스입니다.만약 그렇다면 맞는 말이다Other로 변환할 수 있다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)

한다면X그리고.Y같은 클래스입니까?XY의 슈퍼클래스 또는 슈퍼인터페이스는 true를 반환하고 그렇지 않으면 false를 반환합니다.

  1. X.class.isInstance(y)

말합니다y클래스의 인스턴스입니다.Y,한다면X그리고.Y같은 클래스입니까?XY의 슈퍼클래스 또는 슈퍼인터페이스는 true를 반환하고 그렇지 않으면 false를 반환합니다.

언급URL : https://stackoverflow.com/questions/3949260/java-class-isinstance-vs-class-isassignablefrom

반응형