基本クラスインスタンスから派生クラスの名前を見つける方法はありますか?
例えば。:
class A{
....
}
class B extends A{
...
}
class c extends A{
...
}
メソッドがA
のオブジェクトを返す場合、それがB
タイプかC
タイプかを確認できますか?
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 を使用する必要がありますが、提供された情報ではこれ以上説明できません。
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.
あなたの質問への短い答え
基本クラスオブジェクトから派生クラスの名前を見つける方法はありますか?
no、スーパークラスにはサブクラスの名前/タイプを伝える方法がありません。
オブジェクト(サブクラスのインスタンス)に問い合わせて、それが特定のサブクラスinstanceof
であるかどうかを確認するか、getClass()
メソッドを呼び出す必要があります。
基本クラスインスタンスから派生クラスの名前を見つける方法はありますか?
答えたように ここ 、あなたはこの非常に単純なアプローチを使うことができます。
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
で確認してください。
サブクラスのコンストラクターで実行できます
_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();
を呼び出してください
私が考えることができる2つの方法があります1)1つはJavaリフレクションAPIを使用する2)もう1つはinstanceOfを使用する
他の方法は、オブジェクトをオブジェクトと比較することです。それがどのようになるかはわかりません。これを試すことができます。