オブジェクトo
がクラスC
のインスタンスであるか、またはC
のサブクラスのインスタンスであるかを確認します。
たとえば、p
がクラスPoint
である場合、x.instanceOf(Point.class)
をtrue
に、またx.instanceOf(Object.class)
をtrue
。
ボックス化されたプリミティブ型でも動作するようにします。たとえば、x
がInteger
の場合、x.instanceOf(Integer.class)
はtrue
である必要があります。
そのようなことはありますか?そうでない場合、そのような方法をどのように実装できますか?
Class.isInstance は、必要なことを行います。
if (Point.class.isInstance(someObj)){
...
}
もちろん、代わりにinstanceof
を使用できる場合は使用すべきではありませんが、リフレクションのシナリオではしばしば便利です。
オブジェクトoがクラスcまたはcのサブクラスのインスタンスであるかどうかを確認したい。たとえば、pがPointクラスの場合、x.instanceOf(Point.class)が必要です。
あの…何? o、p、xとは何ですか?
プリミティブ型でも動作するようにします。たとえば、xが整数の場合、x.instanceOf(Integer.class)およびx.instanceOf(Object.class)もtrueでなければなりません。
いいえ。コンパイルすらすべきではありません。プリミティブはオブジェクトではないため、それらのメソッドを呼び出すことはできません。
とにかく、3つのことがあり、そのうちの1つはあなたが望むものを確実に達成することができます(それらは正確に適用される場所で多少異なります:
instanceof
演算子。x instanceof Integer
x instanceof Object
あなたは正しい構文を使用する必要があります
primitveタイプの場合は、まったく別の方法で行う必要があります。それらのメソッドを作成できないため、メソッドを保持するクラスが必要です。したがって、「x.instanceOf(Integer.Class)」の代わりに、「MyClassComparer.instanceOf(x、Integer.Class)」またはそのようなものを呼び出す必要があります。これは、メソッドをオーバーロードすることで簡単に実装できますが、その機能がまったく望ましい場合はわかりません。
実際、Javaにはinstanceofと呼ばれるブール演算子があり、オブジェクトがクラスのインスタンス、サブクラスのインスタンス、または特定のインターフェース。
if(obj instanceof SomeClass) {
// Do something
}
Javaチュートリアルには 良い例 この演算子があります
「プリミティブ型でも動作するようにします。たとえば、xが整数の場合、x.instanceOf(Integer.class)およびx.instanceOf(Object.class)もtrueになります。」
どうして?プリミティブ型と参照型は完全に分離されています。プリミティブintは、IntegerまたはObjectのサブタイプではありません。プリミティブ値の型はコンパイル時に常に静的に知られているため、その型をテストする意味はありません。もちろん、プリミティブ値をボックス化して、そのタイプをテストできます。
(Integer)5 instanceof Integer
しかし、ポイントは何でしょうか?
できるよ:
if (foo instanceof classNameYouWantToCheck)