ましょう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非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。