web-dev-qa-db-ja.com

Javaで使用されている 'instanceof'演算子は何ですか?

instanceof演算子は何に使用されますか?こんなもの見たことがある

if (source instanceof Button) {
    //...
} else {
    //...
}

しかし、それのどれも私には意味をなさない。私は私の研究をしました、しかし説明なしで例だけを思い付きました。

151
Ben

instanceofキーワードは、オブジェクト(インスタンス)が指定されたタイプのサブタイプかどうかをテストするために使用される二項演算子です。

想像してみてください。

interface Domestic {}
class Animal {}
class Dog extends Animal implements Domestic {}
class Cat extends Animal implements Domestic {}

Object dog = new Dog()で作成したdogobjectを想像してみてください。

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

なぜならAnimalDogのスーパータイプであり、おそらく "洗練"されていないからです。

そして、

dog instanceof Cat // does not even compile!

これはDogCatのサブタイプでもスーパータイプでもなく、またそれを実装していないためです。

上記のdogに使用されている変数はObject型です。これはinstanceofruntime操作であることを示し、ユースケースを示します:実行時のオブジェクト型に基づいて異なる反応をする

注意すべきこと:expressionThatIsNull instanceof Tはすべての型Tに対してfalseです。

ハッピーコーディング.

217
user166390

式の左側がのインスタンス右側のクラス名の場合にtrueを返す演算子です。

このように考えてください。あなたのブロック上のすべての家が同じ青写真から建てられたとしましょう。 10の家(物)、1組の青写真(クラス定義)。

instanceofは、オブジェクトのコレクションを持っていて、それらが何であるかがわからないときに便利なツールです。フォーム上にコントロールのコレクションがあるとしましょう。チェックボックスがあるものすべてのチェック状態を読みたいのですが、単純な古いオブジェクトにチェック状態を要求することはできません。代わりに、各オブジェクトがチェックボックスであるかどうかを確認し、そうである場合は、チェックボックスにキャストしてそのプロパティを確認します。

if (obj instanceof Checkbox)
{
    Checkbox cb = (Checkbox)obj;
    boolean state = cb.getState();
}
42

このサイト に記載されているように:

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

これが役に立つことを願っています!

28
fireshadow52

この演算子によって、オブジェクトの種類を判断できます。 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
14

sourceobject変数の場合、instanceofはそれがButtonであるかどうかを確認する方法です。

14
Daniel A. White

他の回答で述べたように、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

TestStringの親クラスではないため。 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); 
    }
}
3
Adam Parkin

ほとんどの人がこの質問の「なに」を正しく説明していますが、「どのように」正しく説明した人はいません。

それで、これは簡単な実例です:

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
1
sziraqui

等価性チェックの省略形として使用できます。

だからこのコード

if(ob != null && this.getClass() == ob.getClass) {
}

と書くことができます

if(ob instanceOf ClassA) {
}
1
mirmdasif
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
bangbang

キーワードのインスタンスは、特定のオブジェクトのインスタンスを知りたいときに役立ちます。

あなたが例外を投げて、あなたが捕獲を持っているとき、そして合計カスタム操作を実行して、そしてあなたの論理(投げまたはログなど)に従って再び続けると仮定

例:1)ユーザーがカスタム例外 "InvalidExtensionsException"を作成し、ロジックに従ってそれをスローしました

2)今catchブロック内catch(Exception e){例外タイプが "InvalidExtensionsException"の場合はsumロジックを実行する

InvalidExtensionsException InvalidException =(InvalidExtensionsException)e;

3)のインスタンスをチェックしておらず、例外タイプがNULLポインタ例外の場合、コードは壊れます。

したがって、ロジックはif(e instanceof InvalidExtensionsException){instanceEx InvalidException = InvalidException =(InvalidExtensionsException)eのインスタンス内にある必要があります。 }

上記の例は、間違ったコーディング方法です。ただし、この例は、そのインスタンスの使用法を理解するのに役立ちます。

0
vaquar khan

Instanceof演算子は、オブジェクトを指定された型と比較します。オブジェクトがクラスのインスタンス、サブクラスのインスタンス、または特定のインタフェースを実装するクラスのインスタンスであるかどうかをテストするためにこれを使用できます。

http://download.Oracle.com/javase/tutorial/Java/nutsandbolts/op2.html