在泛型表达式中使用枚举来定义返回类型

时间:2013-09-22 08:48:38

标签: java generics enums

我正在尝试使用泛型来获取基于枚举参数的返回值。

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);

我如何使用泛型来做到这一点,这样我就不必进行任何投射?这甚至可能吗?

基本上我键入以某种方式将枚举静态绑定到要返回的对象类型以用于泛型表达式。

3 个答案:

答案 0 :(得分:1)

Java中的变体类型以及大多数其他广泛使用的编程语言都是一种痛苦。请参阅我的blog post,其中演示了有关变种的8种方法。

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

答案 1 :(得分:1)

我会传递类对象:

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

然后你可以这样做:

SportsData sportsData = readData(SportsData.class);
HealthData healthData = readData(HealthData.class);

答案 2 :(得分: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的值,他们将使用正确的方法。

如果它是变量,请使用常规方法。