ましょうclazz
、いくつかのことClass
とobj
、いくつかのことObject
。
です
clazz.isAssignableFrom(obj.getClass())
常に同じ
clazz.isInstance(obj)
?
そうでない場合、違いは何ですか?
NullPointerException
if をスローしますobj == null
。
ましょうclazz
、いくつかのことClass
とobj
、いくつかのことObject
。
です
clazz.isAssignableFrom(obj.getClass())
常に同じ
clazz.isInstance(obj)
?
そうでない場合、違いは何ですか?
NullPointerException
if をスローしますobj == null
。
回答:
clazz.isAssignableFrom(Foo.class)
clazz
オブジェクトによって表されるクラスがのスーパークラスまたはスーパーインターフェースである場合は常にtrueになりますFoo
。
clazz.isInstance(obj)
オブジェクトobj
がクラスのインスタンスである場合は常にtrueになりますclazz
。
あれは:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
限り、常に真であるclazz
とobj
非NULLです。
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がnullで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()
スローNullPointerException
しますが、isInstance()
falseを返すだけです。それが本当の答えです。
これら2つの結果は常に同じであると思います。違いは、使用するクラスのインスタンスが必要であり、使用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)
あるComparable.class.isInstance((byte) 1)
真です、。
Byte
あなたがJavadocを調べるNumber
と、それが拡張され、クラスであることがわかります。(byte) 1
はと同等ではありませんByte
。前者はプリミティブです。後者はクラスです。
byte
へByte
のパラメータの型があるためisInstance
ですObject
。