将带有自定义实现方法的通用枚举作为参数传递
Pass a generic enum with custom implemented methods as a parameter
我想映射通用枚举实例的标签 -> 值。这是可行的代码:
public static <T extends Enum<T>> List<Map<String, String>> mapEnumValues(T[] myEnumValues) {
List<Map<String, String>> list = new ArrayList<>();
for (T myEnumValue : myEnumValues) {
Map<String, String> map = new HashMap<>();
map.put("label", myEnumValue.name());
map.put("value", myEnumValue.toString());
list.add(map);
}
return list;
}
但现在我想为地图使用另一个键,例如,我的每个枚举都实现了一个方法 getLabel()
。例如,给定:
public interface Labelizable{
public String getLabel();
}
static public enum Options implements Labelizable {
option01("Option 01", 1), option02("Option 02", 2)
... constructor, getLabel(), ....
所以我想将该行代码替换为:
map.put("label", myEnumValue.getLabel()); // instead of .name()
为了做到这一点,我应该在签名上声明一些东西,强制参数成为一个实现 getLabel()
方法的枚举。例如,我试过
public static <T extends Enum<T implements Labelizable>>
和其他类似的语法都没有成功。有没有办法实现这种行为,或者枚举不能继承的事实阻止了这种方法?
语法是:
public static <T extends Enum<T> & Labelizable>
List<Map<String, String>> mapEnumValues(T[] myEnumValues) {
你把你的泛型参数必须继承的超类放在第一位,然后是它必须实现的接口,全部用&
分隔。
我想映射通用枚举实例的标签 -> 值。这是可行的代码:
public static <T extends Enum<T>> List<Map<String, String>> mapEnumValues(T[] myEnumValues) {
List<Map<String, String>> list = new ArrayList<>();
for (T myEnumValue : myEnumValues) {
Map<String, String> map = new HashMap<>();
map.put("label", myEnumValue.name());
map.put("value", myEnumValue.toString());
list.add(map);
}
return list;
}
但现在我想为地图使用另一个键,例如,我的每个枚举都实现了一个方法 getLabel()
。例如,给定:
public interface Labelizable{
public String getLabel();
}
static public enum Options implements Labelizable {
option01("Option 01", 1), option02("Option 02", 2)
... constructor, getLabel(), ....
所以我想将该行代码替换为:
map.put("label", myEnumValue.getLabel()); // instead of .name()
为了做到这一点,我应该在签名上声明一些东西,强制参数成为一个实现 getLabel()
方法的枚举。例如,我试过
public static <T extends Enum<T implements Labelizable>>
和其他类似的语法都没有成功。有没有办法实现这种行为,或者枚举不能继承的事实阻止了这种方法?
语法是:
public static <T extends Enum<T> & Labelizable>
List<Map<String, String>> mapEnumValues(T[] myEnumValues) {
你把你的泛型参数必须继承的超类放在第一位,然后是它必须实现的接口,全部用&
分隔。