하자 clazz일부가 될 Class및 obj일부를 수 Object.
입니다
clazz.isAssignableFrom(obj.getClass())
항상 같은
clazz.isInstance(obj)
?
그렇지 않은 경우 차이점은 무엇입니까?
NullPointerExceptionif 을 던집니다 obj == null.
하자 clazz일부가 될 Class및 obj일부를 수 Object.
입니다
clazz.isAssignableFrom(obj.getClass())
항상 같은
clazz.isInstance(obj)
?
그렇지 않은 경우 차이점은 무엇입니까?
NullPointerExceptionif 을 던집니다 obj == null.
답변:
clazz.isAssignableFrom(Foo.class)clazz객체가 나타내는 클래스가의 수퍼 클래스 또는 수퍼 인터페이스 일 때마다 true 입니다 Foo.
clazz.isInstance(obj)객체 obj가 클래스의 인스턴스 일 때마다 true clazz입니다.
그건:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
너무 오래 항상 사실 clazz과 obj널이 있습니다.
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b)); -> 인터페이스에서도 마찬가지입니다.
obj입니다 null다음 clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)발생합니다 NullPointerException및 반환하지 true.
두 답변 모두 야구장에 있지만 완전한 답변은 아닙니다.
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
}
}
A.class.isAssignableFrom(B.class)? 나는 출력으로 혼동되었다 :)
isAssignableFrom()a를 throw하고 false 만 반환합니다. 이것이 실제 답변입니다. NullPointerExceptionisInstance()
그 두 가지 결과는 항상 같아야한다고 생각합니다. 차이점은 사용할 클래스의 인스턴스가 필요 isInstance하지만 Class사용할 객체 만 필요하다는 것 isAssignableFrom입니다.
Comparable.class.isAssignableFrom(Byte.class) == true하지만 Byte.class.isInstance(Comparable.class) == false. 다시 말해 isInstance()인터페이스에 대해서는 대칭이 아니며 서브 클래스에 대해서만 대칭입니다.
Byte.class.isInstance(Comparable.class)때문에 false Class입니다 Byte. 에 대한 올바른 비교 Comparable.class.isAssignableFrom(Byte.class)IS Comparable.class.isInstance((byte) 1)사실이다.
Byte확장 Number되고 클래스라는 것을 알 수 있습니다. (byte) 1와 동일하지 않습니다 Byte. 전자는 기본입니다. 후자는 클래스입니다.
byte로 Byte의 매개 변수 유형이 있기 때문 isInstance이다 Object.