使用enum参数自动推断返回类型

时间:2013-01-24 13:36:03

标签: java generics enums

如果我将Enum作为参数提供给Java中的方法,是否可以自动推断返回类型?

我希望能够通过使getValue通用并使用Enum中的信息来支持这些调用

String myval = obj.getValue(MyEnum.Field1)
int myval2 = obj.getValue(MyEnum.Field2)

当前解决方案

我目前的解决方案是这样的:

String val = typeRow.getColumnValueGen(TYPEGODKENDCRM.COLUMN_TYPEGODKENDNR, String.class)

用于访问表的ORM表示中的列。我知道这个字段是一个字符串,我想避免在每次调用时告诉它。

3 个答案:

答案 0 :(得分:5)

  

如果我将Enum作为参数提供给Java中的方法,是否可以自动推断返回类型?

没有。你不能通过Java中的返回类型重载方法,如果你想要类似的东西:

public <T> T getValue(MyEnum enumValue)

编译器无法根据参数推断T。类型推断可以在某些情况下工作,但不是这样的。编译器无法检查参数的某些方面,并根据该值推断或甚至验证类型。

除了其他任何内容之外,如果参数不是编译时常量,你会期望它做什么?

MyEnum x = getEnumValue();
// Is this valid or not?
String myVal = obj.getValue(x);

基本上你会拥有来投射返回值...而在int的情况下,你需要转换为Integer而不是{{1然后让自动取消装箱完成剩下的工作。

就个人而言,我只是创建了多种方法:

int

没有任何歧义的余地,不需要任何巧妙的泛型等。

答案 1 :(得分:2)

总之:No。您必须将getValue声明为返回Object,然后将返回的对象强制转换为实际类型。不漂亮。

答案 2 :(得分:2)

试试这个:

Object getValue(MyEnum returnType) {
    if (returnType == MyEnum.STRING) {
        String myString = ...
        return myString;
    }
    else if (returnType == MyEnum.INT) {
        int myInt = ...
        return Integer(myInt);
    }
}

然后:

String myval = (String) obj.getValue(MyEnum.Field1);
int myval2 = ( (Integer) obj.getValue(MyEnum.Field2) ).intValue();

请注意,您必须使用引用类型才能生效,因此您需要Integer而不是int

顺便说一下,我不推荐这个。如果您想提供有关您尝试做什么的更多信息,我们可能会建议更好的方法来实现它。