2

事前情報。

public abstract class Person {}
public class A extends Person{}
public class B extends Person{}
public class C extends Person{}

public X getPersonByType(String type){
    //This Method will return either A or B or C based on type
    //what should X be ?    
}

Stringを受け取り、のサブタイプであるオブジェクトを返すメソッドを作成する必要がありますPerson

詳しくは。各クラス ABC には、属性パブリック リスト ロールがあります。これらは一意に名前が付けられている必要があるため (JPA 多対多テーブル)、Person クラスに移動することはできません。

可能であれば、personロール属性にアクセスできないため、戻りたくありません(人はそれについて知りません)。また、(可能であれば)instanceOfをキャストまたは使用する必要のないソリューション(可能であれば)を希望します。

PSは試し<? extends Person>ましたが、Eclipseは「メソッドの戻り型がありません」というエラーを出しました

4

4 に答える 4

3

public Person getPersonByType(String type)すべての戻り値の型が extends であるため、正常に動作するはずPersonです。

instanceofこのメソッドを呼び出した後にチェックを回避したい場合は、追加のクラス パラメータを追加することもできます。

public <T extends Person> T getPersonByType(String type, Class<T> type) {
   ...
   // cast result to T
}

この方法を使用すると、戻り値の型をサブクラスに直接割り当てることができます。

C c = getPersonByType("c", C.class);

ClassCastExceptions互いに一致しない String パラメーターと Class パラメーターを渡すと、これが発生する可能性があることに注意してください。

于 2013-10-08T17:57:00.510 に答える
1

戻るべきPerson Xです。Person抽象型であるため、インスタンス化できません。あなたの場合は&である具体的Person Xreference実装のいずれかのオブジェクトを指す必要があります。これが の美しさです。実行時の入力に基づいて、またはクラスのいずれかを作成し、参照を使用してそのオブジェクトを指すようにします。このタイプの設計がどのように機能するかについての詳細情報を提供するFactory Design Patternを参照することをお勧めします。実際のシナリオで。PersonA BCrun time polymorphismobjectABCX

于 2013-10-08T18:05:07.757 に答える
1
public Person getPersonByType(String type){
// analyze type and return appropriate instance...
    if ("A instance".equals(type)) {
        return new A();
    }
...

}
于 2013-10-08T17:57:25.057 に答える
1

Xする必要がありますPerson

Person抽象クラスであり、インスタンス化できないため、常にサブタイプの 1 つを返します。

getPersonByType呼び出し元のメソッドから何が返されたかを知る必要がある場合は、 instanceof演算子を使用できます。

于 2013-10-08T17:52:46.023 に答える