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


87

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

場合たとえば、pクラスであるPoint私がしたいx.instanceOf(Point.class)ことをtrueしてもx.instanceOf(Object.class)しますtrue

ボックス化されたプリミティブ型でも機能するようにしたい。例えば、場合xInteger、その後x.instanceOf(Integer.class)でなければなりませんtrue

そんなことはありますか?そうでない場合、どうすればそのようなメソッドを実装できますか?


ボックス化されたクラスの処理は少し面倒です
dfa 2009年

回答:


172

Class.isInstanceはあなたが望むことをします。

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

もちろん、instanceof代わりに使用できる場合は使用しないでください。ただし、リフレクションのシナリオでは、多くの場合便利です。


6
@Ahamedおそらく遅いですが、さらに悪いことに、理解するのが難しいです!何かを行うための非常に簡単な方法がある場合(たとえば)if (a instanceof Point)、より複雑な方法でそれを行う場合、コードを読む人は誰でも「ああ、これが難しい方法で行われる理由がなければならない」と思わなければなりません。次に、ドキュメントにジャンプして、Class.isInstanceとの違いを確認しますinstanceof。あなたは同僚の時間を無駄にします。
gustafc 2014

21

オブジェクト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()
  • 2つのクラスオブジェクトを指定して割り当て可能性を確認する場合は、Class.isAssignableFrom()

9
x instanceof Integer
x instanceof Object

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

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


4

実際、Javaにはinstanceofというブール演算子があり、これを使用して、オブジェクトがクラスのインスタンス、サブクラスのインスタンス、または特定のインターフェイスを実装するクラスのインスタンスであるかどうかを判別できます。

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

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


1
プリミティブ型でinstanceofを使用することはできません
dfa 2009年

4
彼はプリミティブ型をオブジェクトと混同しました。読んでください...「たとえば、xが整数の場合、x.instanceOf(Integer.class)およびx.instanceOf(Object.class)もtrueである必要があります。」恥ずべきこと
投じる

Javaチュートリアルの使用に関する提案を2番目に(sp)。言語自体を学ぶための良い参考資料です。
luis.espinal 2010

0

できるよ:

if (foo instanceof classNameYouWantToCheck) 

プリミティブ型でinstanceofを使用することはできません
dfa 2009年

クラスは彼がそこにクラス名を書くべきであることを示すためだけのものでした。修正します
fmsf 2009年

0

「プリミティブ型でも機能するようにしたい。たとえば、xが整数の場合、x.instanceOf(Integer.class)とx.instanceOf(Object.class)もtrueである必要があります。」

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

(Integer)5 instanceof Integer

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


-2

生のオブジェクトと一般的なオブジェクトのinstanceofについて混乱していると思います

obj instanceof Class
obj instanceof Class<?> // this is the one you want

2
型消去のため、instanceof演算子の右側でジェネリックを使用することはできません。
マティアス

2
いいえ、それについて混乱しているのはあなたです。の後にraw型を使用する必要がありますinstanceof
Dawood ibnKareem18年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.