web-dev-qa-db-ja.com

オブジェクトがクラスのインスタンスであるかどうかを確認します(ただし、サブクラスのインスタンスではありません)

この例では:

_public class Foo{}

public class Bar extends Foo{}

....

void myMethod(Foo qux){
   if (checkInstance(qux,Foo.class)){
     ....
   }
}
_

quxがFooのインスタンス(fooのサブクラスのインスタンスではない)かどうかを確認するにはどうすればよいですか?あれは:

  • checkInstance(qux、Foo.class)= true
  • checkInstance(qux、Bar.class)= false

このチェックのためにinstanceofのようなステートメントがありますか?またはqux.getClass().equals(Foo.class)を使用する必要があります

37
Addev

これを行う必要がある場合、唯一の方法は、提案したgetClass().equals(Foo.class)オプションです。

ただし、OO設計の目的は、anyFooを同じ方法で処理できるようにすることです。インスタンスがサブクラスであるかどうかは通常のプログラムでは無関係です。

50
Duncan Jones

正確なクラス一致を探している場合、唯一の手段はqux.getClass().equals(Foo.class)です。 instanceofは、サブクラスに対してもtrueを返します。

6
nitegazer2003

instanceofを使用する必要があります

if(qux instanceof Foo && !(qux instanceof Bar)) {
    ...
}

これはクラスとインターフェースの両方で機能するため、ほとんどの場合、.classこれはインターフェースでは機能しません。

3
Marco Forberg

私はちょうど次のコードを試しましたが、うまく機能しているようです

public class BaseClass {

    private String a;

    public boolean isInstanceOf(BaseClass base){
        if(base == null){
            return false;
        }
        else if(getClass() == base.getClass()){
            return true;
        }else{
            return false;
        }
    }

}



public class DervidClass extends BaseClass {


    public boolean isInstanceOf(DervidClass base) {
        if(base == null){
            return false;
        }
        else if(getClass() == base.getClass()){
            return true;
        }else{
            return false;
        }
    }


}

public class myTest {
public static void main(String[] args) throws ParseException {


        BaseClass base = new BaseClass();
        BaseClass base1 = new BaseClass();
        DervidClass derived = new DervidClass();

        BaseClass d1 = new DervidClass();

        System.out.println(base.isInstanceOf(d1));
        System.out.println(d1.isInstanceOf(d1));
        System.out.println((d1 instanceof BaseClass));


    }
2
Karthik Prasad
    package com.instance;

    public class Foo {
        public void instance(Foo f) {
            System.out.println("---------");
            System.out.println(f.getClass());
            System.out.println(getClass());
            if (f.getClass() == getClass()) {
                System.out.println("Yes");
            } else {
                System.out.println("No");
            }
        }
    }


package com.instance;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Foo f1 = new Foo();
        Foo f2 = new Foo();
        Foo f3 = new Bar();
        f1.instance(f1);
        f1.instance(f2);
        f1.instance(f3);
    }

}
1
boiledwater

これまでに投稿されたすべての回答を読みましたが、まだ満足のいく回答が見つかりませんでした。 このチェックにinstanceofのようなステートメントがありますか?またはqux.getClass().equals(Foo.class)を使用する必要があります質問[はい、Java]にinstanceof演算子がありますオブジェクトがクラスのインスタンスかどうかを確認します。以下に例を示します:

_class Vehicle {

}

class Car extends Vehicle {

}

public class Research {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();

        if (vehicle instanceof Vehicle) {
            System.out.println("vehicle instanceof Vehicle : TRUE");
        } else {
            System.out.println("vehicle instanceof Vehicle : FALSE");
        }

        if (vehicle instanceof Car) {
            System.out.println("vehicle instanceof Car : TRUE");
        } else {
            System.out.println("vehicle instanceof Car : FALSE");
        }

        System.out.println();
        Car car = new Car();

        if (car instanceof Vehicle) {
            System.out.println("car instanceof Vehicle : TRUE");
        } else {
            System.out.println("car instanceof Vehicle : FALSE");
        }

        if (car instanceof Car) {
            System.out.println("car instanceof Car : TRUE");
        } else {
            System.out.println("car instanceof Car : FALSE");
        }
    }
}
_

出力-:

_vehicle instanceof Vehicle : TRUE
vehicle instanceof Car : FALSE

car instanceof Vehicle : TRUE
car instanceof Car : TRUE
_

説明-:instanceof演算子は、オブジェクトがクラスのインスタンスであるか、その親クラス(任意のレベルまで)であるかを示します。
_vehicle instanceof Car : FALSE_行の出力は、instanceof演算子がオブジェクトがそのサブクラスのインスタンスであるかどうかを判断しないことを示しています。

別の方法は、getClass().equals(Foo.class)を使用して、オブジェクトがクラスのインスタンスであるかどうかを判別することです。以下の例を見てみましょう-

_class Vehicle {

}

class Car extends Vehicle {

}

public class Research {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();

        if (vehicle.getClass().equals(Vehicle.class)) {
            System.out.println("vehicle instanceof Vehicle : TRUE");
        } else {
            System.out.println("vehicle instanceof Vehicle : FALSE");
        }

        if (vehicle.getClass().equals(Car.class)) {
            System.out.println("vehicle instanceof Car : TRUE");
        } else {
            System.out.println("vehicle instanceof Car : FALSE");
        }

        System.out.println();
        Car car = new Car();

        if (car.getClass().equals(Vehicle.class)) {
            System.out.println("car instanceof Vehicle : TRUE");
        } else {
            System.out.println("car instanceof Vehicle : FALSE");
        }

        if (car.getClass().equals(Car.class)) {
            System.out.println("car instanceof Car : TRUE");
        } else {
            System.out.println("car instanceof Car : FALSE");
        }


    }
}
_

出力-:

_vehicle instanceof Vehicle : TRUE
vehicle instanceof Car : FALSE

car instanceof Vehicle : FALSE
car instanceof Car : TRUE
_

説明-:上記の例から、どの2つのうち2つを選択する必要があるかは明らかです。

重要な注意事項::

  1. instanceof演算子は、参照変数がオブジェクトを指していない場合(つまり、null参照を持っている場合)にNullPointerException例外をスローしません。
  2. car.getClass().equals(Car.class)は、NullPointerExceptionがオブジェクトを指していない場合(つまり、null参照を持っている場合)にcar例外をスローします。したがって、NullPointerExceptionを防ぐために、car != null && car.getClass().equals(Car.class)などの追加のヌルチェックを配置する必要があります。
  3. instanceof演算子は、オブジェクトがクラスのインスタンスであるか、その親クラス(任意のレベルまで)であるかを示します。
  4. car.getClass().equals(Car.class)は、オブジェクトがクラスのみのインスタンスであるかどうかを示します。 (親クラスとサブクラスはまったく考慮されません)
1
Ashish Kumar

あなたはすでにquxがFooのインスタンスであることを知っています(nullでない限り...)ので、単純なqux instanceof Barとnullチェックで十分です。

0
vikingsteve