web-dev-qa-db-ja.com

JavaにはinstanceOf(Class <?> c)のようなものがありますか?

オブジェクトoがクラスCのインスタンスであるか、またはCのサブクラスのインスタンスであるかを確認します。

たとえば、pがクラスPointである場合、x.instanceOf(Point.class)trueに、またx.instanceOf(Object.class)true

ボックス化されたプリミティブ型でも動作するようにします。たとえば、xIntegerの場合、x.instanceOf(Integer.class)trueである必要があります。

そのようなことはありますか?そうでない場合、そのような方法をどのように実装できますか?

82
snakile

Class.isInstance は、必要なことを行います。

if (Point.class.isInstance(someObj)){
    ...
}

もちろん、代わりにinstanceofを使用できる場合は使用すべきではありませんが、リフレクションのシナリオではしばしば便利です。

158
gustafc

オブジェクト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演算子。
  • Class.isInstance() コンパイル時に不明なクラスに対してオブジェクトのクラスをチェックする場合。
  • Class.isAssignableFrom() 指定された2つのクラスオブジェクトの割り当て可能性を確認する場合。
19
x instanceof Integer
x instanceof Object

あなたは正しい構文を使用する必要があります

primitveタイプの場合は、まったく別の方法で行う必要があります。それらのメソッドを作成できないため、メソッドを保持するクラスが必要です。したがって、「x.instanceOf(Integer.Class)」の代わりに、「MyClassComparer.instanceOf(x、Integer.Class)」またはそのようなものを呼び出す必要があります。これは、メソッドをオーバーロードすることで簡単に実装できますが、その機能がまったく望ましい場合はわかりません。

8

実際、Javaにはinstanceofと呼ばれるブール演算子があり、オブジェクトがクラスのインスタンス、サブクラスのインスタンス、または特定のインターフェース。

if(obj instanceof SomeClass) {
    // Do something
}

Javaチュートリアルには 良い例 この演算子があります

4
victor hugo

「プリミティブ型でも動作するようにします。たとえば、xが整数の場合、x.instanceOf(Integer.class)およびx.instanceOf(Object.class)もtrueになります。」

どうして?プリミティブ型と参照型は完全に分離されています。プリミティブintは、IntegerまたはObjectのサブタイプではありません。プリミティブ値の型はコンパイル時に常に静的に知られているため、その型をテストする意味はありません。もちろん、プリミティブ値をボックス化して、そのタイプをテストできます。

(Integer)5 instanceof Integer

しかし、ポイントは何でしょうか?

0
newacct

できるよ:

if (foo instanceof classNameYouWantToCheck) 
0
fmsf