하자 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를 돌려줍니다.
답변
