java: Class.isInstance와 Class.isAssignableFrom
허락하다clazz
대단하다Class
그리고.obj
대단하다Object
.
이
clazz.isAssignableFrom(obj.getClass())
항상 똑같다
clazz.isInstance(obj)
?
그렇지 않으면 어떤 차이가 있습니까?
clazz.isAssignableFrom(Foo.class)
에 의해 대표되는 클래스가 항상 참이 될 것이다.clazz
object는 슈퍼클래스 또는 슈퍼인터페이스입니다Foo
.
clazz.isInstance(obj)
대상이 될 때마다 진실이 될 것이다.obj
클래스의 인스턴스입니다.clazz
.
즉, 다음과 같습니다.
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
이라면 언제나 진실이다clazz
그리고.obj
null이 아닙니다.
두 답변 모두 대략적인 수준이지만 둘 다 완전한 답변은 아니다.
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를 이해할 수 있습니다.
X.class.isAssignableFrom(Y.class)
한다면X
그리고.Y
같은 클래스입니까?X
이Y
의 슈퍼클래스 또는 슈퍼인터페이스는 true를 반환하고 그렇지 않으면 false를 반환합니다.
X.class.isInstance(y)
말합니다y
클래스의 인스턴스입니다.Y
,한다면X
그리고.Y
같은 클래스입니까?X
이Y
의 슈퍼클래스 또는 슈퍼인터페이스는 true를 반환하고 그렇지 않으면 false를 반환합니다.
언급URL : https://stackoverflow.com/questions/3949260/java-class-isinstance-vs-class-isassignablefrom
'source' 카테고리의 다른 글
vue cli 3에서 생성된 프로젝트에서 개발 서버를 시작하는 중 (0) | 2022.08.13 |
---|---|
Vue 라우터가 페이지를 변경할 때 Jquery 플러그인/스크립트를 로드하는 방법 (0) | 2022.08.13 |
xmalloc과 malloc의 차이점은 무엇입니까? (0) | 2022.08.12 |
2D 어레이에서 반복할 때 루프 순서가 성능에 영향을 미치는 이유는 무엇입니까? (0) | 2022.08.12 |
vue.for에서 html 요소를 사용하지 않음v-for (0) | 2022.08.12 |