Мне нужно реализовать enum для преобразования enum в 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";
}
}
и Enum_2
который реализует LabelAware
и должен быть преобразован в 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 - это общий класс, поэтому ваши дженерики включают в себя необработанный тип, как написано. Обычно вам нужно '>'. Не уверен, что это ваша проблема. –
yshavit
@yshavit, ничего не меняет - все еще присутствует предупреждение. – Opal