如何编写一个可以基于枚举作为参数返回不同数据类型的方法?

时间:2016-10-03 11:26:45

标签: java enums

我想定义一个方法并通过传递枚举,返回基于枚举的映射类型。到目前为止,我只是这样做:

public class Person {

    HashMap<String, Object> mData;


    void int getDetail(DetailInt detail){
        Object data = mData.get(detail.name());
        if(data instanceof Integer)
            return (int)data;
        return 0;
    }

    void String getDetail(DetailStr detail){
        Object data = mData.get(detail.name());
        if(data instanceof String)
            return (String)data;
        return "";
    }

}



public enum DetailInt {
    Age("age"), Weight("weight"), Height("height");

    String columnName;
    DetailInt(String columnName){
        this.columnName= columnName;
    }
}

public enum DetailStr {
    FirstName("first_name"), LastName("last_name");

    String columnName;
    DetailStr (String columnName){
        this.columnName= columnName;
    }
}

所以我可以使用相同的方法,但传递不同的枚举来获取具有类型的数据。

int age = person.getDetail(DetailInt.Age);
String firstName = person.getDetail(DetailStr.FirstName);

现在,我想要实现的是将两个枚举合并在一起,所以我可以调用如下:

int age = person.getDetail(Detail.Age);
String firstName = person.getDetail(Detail.FirstName);

整洁。但是,我已经尝试过泛型类型和接口,仍然找不到这样做的方法。使用下面的方法类似于我想要的但这不是枚举类型。

abstract class Detail {

}

class DetailStr extend Detail {

}

interface Details {
    DetailStr firstName = new DetailStr("first_name");
    DetailStr lastName = new DetailStr("las_name");
    DetailInt age = new DetailInt("age");
    DetailInt weight = new DetailInt("weight");
    DetailInt height = new DetailInt("height");
}

public class Person {

    void int getDetail(DetailInt detail){
        ....
    }

    void String getDetail(DetailStr detail){
        ....
    }

}

2 个答案:

答案 0 :(得分:3)

你不能用Java做到这一点。

这是因为枚举数的特定值与该枚举数的任何其他值具有相同的类型。因此,不可能构造一个重载函数,因为没有类型差异可以充当描述符。 (不能仅通过返回类型差异来重载函数。)

显而易见的解决方案是使用两种方法getDetailAsIntgetDetailAsString

答案 1 :(得分:2)

我将分享这种不使用枚举的方法,但它可能对你有用:

public class Key<T> {
    private String key;

    ...
}

public class Keys {
    public static final Key FIRST_NAME = new Key<String>("first_name");
    public static final Key AGE = new Key<Integer>("age");
}

public class Person {
    public <T> T getDetail(Key<T> key) {
        Object detail = mData.get(key.getKey());
        return (T) detail;
    }
}

我担心可能无法将其转换为使用枚举,因此您必须确保不会以其他方式创建不需要的密钥(包私有构造函数等)。