我想定义一个方法并通过传递枚举,返回基于枚举的映射类型。到目前为止,我只是这样做:
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){
....
}
}
答案 0 :(得分:3)
你不能用Java做到这一点。
这是因为枚举数的特定值与该枚举数的任何其他值具有相同的类型。因此,不可能构造一个重载函数,因为没有类型差异可以充当描述符。 (不能仅通过返回类型差异来重载函数。)
显而易见的解决方案是使用两种方法getDetailAsInt
和getDetailAsString
。
答案 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;
}
}
我担心可能无法将其转换为使用枚举,因此您必须确保不会以其他方式创建不需要的密钥(包私有构造函数等)。