instanceof
演算子は何に使用されますか?こんなもの見たことがある
if (source instanceof Button) {
//...
} else {
//...
}
しかし、それのどれも私には意味をなさない。私は私の研究をしました、しかし説明なしで例だけを思い付きました。
instanceof
キーワードは、オブジェクト(インスタンス)が指定されたタイプのサブタイプかどうかをテストするために使用される二項演算子です。
想像してみてください。
interface Domestic {}
class Animal {}
class Dog extends Animal implements Domestic {}
class Cat extends Animal implements Domestic {}
Object dog = new Dog()
で作成したdog
objectを想像してみてください。
dog instanceof Domestic // true - Dog implements Domestic
dog instanceof Animal // true - Dog extends Animal
dog instanceof Dog // true - Dog is Dog
dog instanceof Object // true - Object is the parent type of all objects
しかしObject animal = new Animal();
では、
animal instanceof Dog // false
なぜならAnimal
はDog
のスーパータイプであり、おそらく "洗練"されていないからです。
そして、
dog instanceof Cat // does not even compile!
これはDog
がCat
のサブタイプでもスーパータイプでもなく、またそれを実装していないためです。
上記のdog
に使用されている変数はObject
型です。これはinstanceof
がruntime操作であることを示し、ユースケースを示します:実行時のオブジェクト型に基づいて異なる反応をする。
注意すべきこと:expressionThatIsNull instanceof T
はすべての型T
に対してfalseです。
ハッピーコーディング.
式の左側がのインスタンス右側のクラス名の場合にtrueを返す演算子です。
このように考えてください。あなたのブロック上のすべての家が同じ青写真から建てられたとしましょう。 10の家(物)、1組の青写真(クラス定義)。
instanceof
は、オブジェクトのコレクションを持っていて、それらが何であるかがわからないときに便利なツールです。フォーム上にコントロールのコレクションがあるとしましょう。チェックボックスがあるものすべてのチェック状態を読みたいのですが、単純な古いオブジェクトにチェック状態を要求することはできません。代わりに、各オブジェクトがチェックボックスであるかどうかを確認し、そうである場合は、チェックボックスにキャストしてそのプロパティを確認します。
if (obj instanceof Checkbox)
{
Checkbox cb = (Checkbox)obj;
boolean state = cb.getState();
}
このサイト に記載されているように:
instanceof
演算子は、オブジェクトが特定の型であるかどうかをテストするために使用できます。if (objectReference instanceof type)
簡単な例:
String s = "Hello World!" return s instanceof String; //result --> true
ただし、null参照変数/式に
instanceof
を適用すると、falseが返されます。String s = null; return s instanceof String; //result --> false
サブクラスはスーパークラスの「型」であるため、これを検証するために
instanceof
を使用できます。class Parent { public Parent() {} } class Child extends Parent { public Child() { super(); } } public class Main { public static void main(String[] args) { Child child = new Child(); System.out.println( child instanceof Parent ); } } //result --> true
これが役に立つことを願っています!
この演算子によって、オブジェクトの種類を判断できます。 boolean
値を返します。
例えば
package test;
import Java.util.Date;
import Java.util.Map;
import Java.util.HashMap;
public class instanceoftest
{
public static void main(String args[])
{
Map m=new HashMap();
System.out.println("Returns a boolean value "+(m instanceof Map));
System.out.println("Returns a boolean value "+(m instanceof HashMap));
System.out.println("Returns a boolean value "+(m instanceof Object));
System.out.println("Returns a boolean value "+(m instanceof Date));
}
}
出力は以下のとおりです。
Returns a boolean value true
Returns a boolean value true
Returns a boolean value true
Returns a boolean value false
source
がobject
変数の場合、instanceof
はそれがButton
であるかどうかを確認する方法です。
他の回答で述べたように、instanceof
の標準的な典型的な使い方は、識別子がより具体的な型を参照しているかどうかを調べるためのものです。例:
Object someobject = ... some code which gets something that might be a button ...
if (someobject instanceof Button) {
// then if someobject is in fact a button this block gets executed
} else {
// otherwise execute this block
}
ただし、左側の式の型は、右側の式の親型である必要があります( JLS 15.20.2を参照) and Java Puzzlers、#50、pp114 )たとえば、次はコンパイルに失敗します。
public class Test {
public static void main(String [] args) {
System.out.println(new Test() instanceof String); // will fail to compile
}
}
これはメッセージとコンパイルしません:
Test.Java:6: error: inconvertible types
System.out.println(t instanceof String);
^
required: String
found: Test
1 error
Test
はString
の親クラスではないため。 OTOH、これは完全にコンパイルされ、期待どおりにfalse
を出力します。
public class Test {
public static void main(String [] args) {
Object t = new Test();
// compiles fine since Object is a parent class to String
System.out.println(t instanceof String);
}
}
ほとんどの人がこの質問の「なに」を正しく説明していますが、「どのように」正しく説明した人はいません。
それで、これは簡単な実例です:
String s = new String("Hello");
if (s instanceof String) System.out.println("s is instance of String"); // True
if (s instanceof Object) System.out.println("s is instance of Object"); // True
//if (s instanceof StringBuffer) System.out.println("s is instance of StringBuffer"); // Compile error
Object o = (Object)s;
if (o instanceof StringBuffer) System.out.println("o is instance of StringBuffer"); //No error, returns False
else System.out.println("Not an instance of StringBuffer"); //
if (o instanceof String) System.out.println("o is instance of String"); //True
出力:
s is instance of String
s is instance of Object
Not an instance of StringBuffer
o is instance of String
s
をStringBufferと比較したときのコンパイラエラーの理由は、 docs でよく説明されています。
オブジェクトがクラスのインスタンス、サブクラスのインスタンス、または特定のインタフェースを実装するクラスのインスタンスであるかどうかをテストするためにこれを使用できます。
つまり、LHSはRHSのインスタンスか、RHSを実装するかRHSを拡張するクラスのインスタンスである必要があります。
そのときのinstanceofの使い方は?
すべてのClassはObjectを拡張するので、LHSをobjectに型キャストすることは常にあなたのためになるでしょう:
String s = new String("Hello");
if ((Object)s instanceof StringBuffer) System.out.println("Instance of StringBuffer"); //No compiler error now :)
else System.out.println("Not an instance of StringBuffer");
出力:
Not an instance of StringBuffer
等価性チェックの省略形として使用できます。
だからこのコード
if(ob != null && this.getClass() == ob.getClass) {
}
と書くことができます
if(ob instanceOf ClassA) {
}
public class Animal{ float age; }
public class Lion extends Animal { int claws;}
public class Jungle {
public static void main(String args[]) {
Animal animal = new Animal();
Animal animal2 = new Lion();
Lion lion = new Lion();
Animal animal3 = new Animal();
Lion lion2 = new Animal(); //won't compile (can't reference super class object with sub class reference variable)
if(animal instanceof Lion) //false
if(animal2 instanceof Lion) //true
if(lion insanceof Lion) //true
if(animal3 instanceof Animal) //true
}
}
キーワードのインスタンスは、特定のオブジェクトのインスタンスを知りたいときに役立ちます。
あなたが例外を投げて、あなたが捕獲を持っているとき、そして合計カスタム操作を実行して、そしてあなたの論理(投げまたはログなど)に従って再び続けると仮定
例:1)ユーザーがカスタム例外 "InvalidExtensionsException"を作成し、ロジックに従ってそれをスローしました
2)今catchブロック内catch(Exception e){例外タイプが "InvalidExtensionsException"の場合はsumロジックを実行する
InvalidExtensionsException InvalidException =(InvalidExtensionsException)e;
3)のインスタンスをチェックしておらず、例外タイプがNULLポインタ例外の場合、コードは壊れます。
したがって、ロジックはif(e instanceof InvalidExtensionsException){instanceEx InvalidException = InvalidException =(InvalidExtensionsException)eのインスタンス内にある必要があります。 }
上記の例は、間違ったコーディング方法です。ただし、この例は、そのインスタンスの使用法を理解するのに役立ちます。
Instanceof演算子は、オブジェクトを指定された型と比較します。オブジェクトがクラスのインスタンス、サブクラスのインスタンス、または特定のインタフェースを実装するクラスのインスタンスであるかどうかをテストするためにこれを使用できます。
http://download.Oracle.com/javase/tutorial/Java/nutsandbolts/op2.html