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

我会传递类对象:

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

然后你可以这样做:

SportsData sportsData = readData(SportsData.class);
HealthData healthData = readData(HealthData.class);
于 2013-09-22T09:56:17.390 回答
1

Java 和大多数其他广泛使用的编程语言中的变体类型令人头疼。请参阅我的博客文章,其中演示了大约 8 种方法来做变体。

在您的特定情况下,您永远不会实现您演示的最后五行代码。您可以期望的最好的结果就是始终GeneralData以类型安全的方式获取并“询问”它(例如,通过使用访问者模式)。

于 2013-09-22T09:29:52.427 回答
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 回答