1

ジェネリックを使用して、列挙型引数に基づいて戻り値を取得しようとしています。

public enum DataTypes {
   MEAL, EXAM_RESULT, SPORTS,ECA, HEATLH;
}


public class GeneralData{
    String getDataFile();
}

public class SportsData extends GeneralData{
    getDailyCalroiesBurnt();
    getSwimmingStyle();
}

public class HealthData extends GeneralData{
    getBloodGroup();
}

ここで、関数「getData(DataTypes datatype)」を書きたいと思います。

  • DataTypes.SPORTS で呼び出すと、SportsData オブジェクトが返されます
  • DataTypes.HEATLH で呼び出すと、HealthData オブジェクトが返されます
  • その他すべての戻り値 GeneralData オブジェクト。

何かのようなもの :

<T> T getData(DataTypes datatype){
    ...
    ...
}

HealthData healthData = getData(DataTypes.HEATLH);
SportsData sportsData = getData(DataTypes.SPORTS);
GeneralData examData = getData(DataTypes.EXAM_RESULT);
GeneralData mealData = getData(DataTypes.MEAL);
GeneralData ecaData = getData(DataTypes.ECA);

キャストを行う必要がないように、ジェネリックを使用してこれを行うにはどうすればよいですか? これは可能ですか?

基本的に、列挙型をオブジェクト型に静的にバインドして、ジェネリック式で使用するために返される型です。

4

3 に答える 3

1

Java やその他の広く使用されているプログラミング言語のバリアント型は厄介な問題です。バリアントを実行する約 8 つの方法を示す私のブログ投稿を参照してください。

あなたの特定のケースでは、あなたが示す最後の 5 行のコードを達成することは決してありません。期待できる最善の方法は、常に を取得GeneralDataし、タイプ セーフな方法で (たとえば、ビジター パターンを使用して) 「問い合わせる」ことです。

于 2013-09-22T09:29:52.427 に答える
1

代わりにクラス オブジェクトを渡します。

<T extends GeneralData> T getData(Class<T> clazz);

次に、次のことができます。

SportsData sportsData = readData(SportsData.class);
HealthData healthData = readData(HealthData.class);
于 2013-09-22T09:56:17.390 に答える
0

これは不可能です。

その上、それはおそらくあなたが望むことをする正しい方法ではありません(IMO)。

列挙型として変数を受け取っている場合、メソッドは何を返すと思いますか?

  void MyMethod(DataTypes x)
  {
        /*?*/ result = getData(x);


        // print result or whatever..
  }

メソッドの戻り値の型は、コンパイル時の情報です。つまり、コンパイル時に認識されている必要があります。

一方、パラメーターの値は、実行時にのみわかります。

私はあなたのコードに精通していませんが、これは悪い解決策ではないと思います:

  HealthData healthData = getHeatlhData();
  SportsData sportsData = getSportsData();
  GeneralData examData = getData(DataTypes.EXAM_RESULT);
  GeneralData mealData = getData(DataTypes.MEAL);
  GeneralData ecaData = getData(DataTypes.ECA);
  GeneralData ecaData = getData(x);

これは合理的だと思います。

列挙値に対して多数の if-else-if を使用する代わりに、メソッドをいくつか追加します。それは実際にはきれいです。

プログラマーが必要とする DataType の値を知っている場合、プログラマーは適切な方法を使用します。

変数の場合は、一般的な方法を使用します。

于 2013-09-22T09:03:49.600 に答える