【发布时间】:2016-11-05 15:20:54
【问题描述】:
我需要在 java 中实现一个枚举到枚举转换器:Enum_2 > Enum_1,我想以通用方式实现。
所以我定义了一个接口:
interface LabelAware<T extends Enum> {
String getLabel();
T getObject();
}
和Enum_1:
enum Enum_1 {
A, B;
String getValue() {
return "whatever";
}
}
以及实现LabelAware的Enum_2,需要转换成Enum_1:
enum Enum_2 implements LabelAware<Enum_1> {
C("c", Enum_1.A), D("d", Enum_1.B);
private final String label;
private final Enum_1 object;
Enum_2(String label, Enum_1 object) {
this.label = label;
this.object = object;
}
public String getLabel() {
return label;
}
public Enum_1 getObject() {
return object;
}
}
最后,这是一个通用转换器(List.ofAll() 来自javaslang):
class Converter<S extends LabelAware, D extends Enum> {
private S[] values;
Converter(S[] values) {
this.values = values;
}
D map(String label) {
return (D) List.of(values)
.find(v -> v.getLabel().equals(label))
.map(LabelAware::getObject)
.getOrElseThrow(() -> new RuntimeException(""));
}
}
还有一个主要方法:
public class Main {
public static void main(String[] args) {
System.out.println(new Converter<Enum_2, Enum_1>(Enum_2.values()).map("c").getValue());
}
}
这一切都编译并运行良好,但是我不知道为什么我需要将Converter.map 方法的结果转换为D,因为我已经声明D 来扩展Enum。可以在没有任何警告的情况下以通用方式完成吗?
【问题讨论】:
-
List.of(values)不是S类型的吗? -
我在用手机,所以很难阅读,但请注意 Enum 是一个泛型类,所以你的泛型包含一个原始类型。通常你会想要
<T extends Enum <T>>。不确定这是否是您的问题。 -
@yshavit,它没有任何改变 - 未经检查的警告仍然存在。
-
@EliSadoff,将。请注意
S本身被参数化为返回Enum<T>所以它应该被捕获。