하자 clazz
일부가 될 Class
및 obj
일부를 수 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)
너무 오래 항상 사실 clazz
과 obj
널이 있습니다.
답변
두 답변 모두 야구장에 있지만 완전한 답변은 아닙니다.
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를 이해할 수 있습니다.
X.class.isAssignableFrom(Y.class)
경우 X
와 Y
같은 클래스, 또는 X
이다 Y
‘의 슈퍼 클래스 나 슈퍼 인터페이스를 참, 그렇지 않으면 false를 반환합니다.
X.class.isInstance(y)
말은 y
클래스의 인스턴스 인 Y
경우 X
와 Y
같은 클래스, 또는 X
이고 Y
, 그렇지 않으면 false의 슈퍼 클래스 나 슈퍼 인터페이스는, true를 돌려줍니다.