この例では:
_public class Foo{}
public class Bar extends Foo{}
....
void myMethod(Foo qux){
if (checkInstance(qux,Foo.class)){
....
}
}
_
qux
がFooのインスタンス(fooのサブクラスのインスタンスではない)かどうかを確認するにはどうすればよいですか?あれは:
このチェックのためにinstanceof
のようなステートメントがありますか?またはqux.getClass().equals(Foo.class)
を使用する必要があります
これを行う必要がある場合、唯一の方法は、提案したgetClass().equals(Foo.class)
オプションです。
ただし、OO設計の目的は、anyFoo
を同じ方法で処理できるようにすることです。インスタンスがサブクラスであるかどうかは通常のプログラムでは無関係です。
正確なクラス一致を探している場合、唯一の手段はqux.getClass().equals(Foo.class)
です。 instanceofは、サブクラスに対してもtrueを返します。
instanceofを使用する必要があります
if(qux instanceof Foo && !(qux instanceof Bar)) {
...
}
これはクラスとインターフェースの両方で機能するため、ほとんどの場合、.class
これはインターフェースでは機能しません。
私はちょうど次のコードを試しましたが、うまく機能しているようです
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));
}
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);
}
}
これまでに投稿されたすべての回答を読みましたが、まだ満足のいく回答が見つかりませんでした。 このチェックに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つを選択する必要があるかは明らかです。
重要な注意事項::
instanceof
演算子は、参照変数がオブジェクトを指していない場合(つまり、null参照を持っている場合)にNullPointerException
例外をスローしません。car.getClass().equals(Car.class)
は、NullPointerException
がオブジェクトを指していない場合(つまり、null参照を持っている場合)にcar
例外をスローします。したがって、NullPointerException
を防ぐために、car != null && car.getClass().equals(Car.class)
などの追加のヌルチェックを配置する必要があります。instanceof
演算子は、オブジェクトがクラスのインスタンスであるか、その親クラス(任意のレベルまで)であるかを示します。car.getClass().equals(Car.class)
は、オブジェクトがクラスのみのインスタンスであるかどうかを示します。 (親クラスとサブクラスはまったく考慮されません)あなたはすでにquxがFooのインスタンスであることを知っています(nullでない限り...)ので、単純なqux instanceof Bar
とnullチェックで十分です。