web-dev-qa-db-ja.com

基本クラスインスタンスからサブクラスを見つける方法は?

基本クラスインスタンスから派生クラスの名前を見つける方法はありますか?

例えば。:

class A{
    ....
}
class B extends A{
    ...
}
class c extends A{
    ...
}

メソッドがAのオブジェクトを返す場合、それがBタイプかCタイプかを確認できますか?

17
Vaishak Suresh

instanceofまたはClass#getClass()のいずれかを使用する

_A returned = getA();

if (returned instanceof B) { .. }
else if (returned instanceof C) { .. }
_

getClass()は、_A.class_、_B.class_、_C.class_のいずれかを返します。

If句の内部では、ダウンキャストする必要があります-つまり、.

_((B) returned).doSomethingSpecificToB();
_

とはいえ、instanceofまたはgetClass()を使用することは悪い習慣であると考えられることがあります。具体的なサブクラスをチェックする必要性を回避するために polymorphism を使用する必要がありますが、提供された情報ではこれ以上説明できません。

20
Bozho

instanceofを使用してみましたか

例えば.

Class A aDerived= something.getSomethingDerivedFromClassA();

if (aDerived instanceof B) {

} else if (aDerived instanceof C) {

}

//Use type-casting where necessary in the if-then statement.
5
Buhake Sindi

あなたの質問への短い答え

基本クラスオブジェクトから派生クラスの名前を見つける方法はありますか?

no、スーパークラスにはサブクラスの名前/タイプを伝える方法がありません。

オブジェクト(サブクラスのインスタンス)に問い合わせて、それが特定のサブクラスinstanceofであるかどうかを確認するか、getClass()メソッドを呼び出す必要があります。

3
Timothy

基本クラスインスタンスから派生クラスの名前を見つける方法はありますか?

答えたように ここ 、あなたはこの非常に単純なアプローチを使うことができます。

abstract class A {
    public final String getName() {
         return this.getClass().getName();
    }
}

class B extends A { }

class C extends A { }

次に、現在のclass名を出力するだけです。

B b = new B();
C c = new C();

System.out.println(b.getName());
System.out.println(c.getName());

出力:

com.test.B
com.test.C

追加のStringsを格納する必要はありません。サブクラスのメソッドをinstanceofまたはoverrideで確認してください。

2
Marko Pacak

サブクラスのコンストラクターで実行できます

_class A {
    protected String classname;
    public A() { this.classname = "A"; }
    public String getClassname() { return this.classname; }
}
class B extends A {
    public B() {
        super();
        this.classname = "B";
    }
}
_

そう

_A a = new A();
a.getClassname(); // returns "A"
B b = new B();
b.getClassname(); // returns "B"
((A)b).getClassname(); // Also returns "B"
_

「A」オブジェクトにキャストされるため、「A」getClassname()関数を呼び出しますが、「B」コンストラクターであるコンストラクターによって設定された値を返します。

注:設定する前にsuper();を呼び出してください

1
Mario Gravel

私が考えることができる2つの方法があります1)1つはJavaリフレクションAPIを使用する2)もう1つはinstanceOfを使用する

他の方法は、オブジェクトをオブジェクトと比較することです。それがどのようになるかはわかりません。これを試すことができます。

0
gmhk