Я написал следующий пользовательский ChoiceBox, который заполняет себя из общего Enum, реализующего мой интерфейс DisplayName ниже:
import java.util.Objects;
import javafx.scene.control.ChoiceBox;
import javafx.util.StringConverter;
public class EnumChoiceBox<T extends Enum<T>&DisplayName<T>> extends ChoiceBox<T> {
public EnumChoiceBox(Class<T> enumType) {
super();
getItems().setAll(enumType.getEnumConstants());
this.setConverter(new StringConverter<T>() {
@Override
public String toString(T object) {
return object.toDisplayName();
}
@Override
public T fromString(String string) {
for(T t : getItems()) if(t.toDisplayName().equals(string)) return t;
return null;
}
});
}
@SuppressWarnings("unchecked")
public EnumChoiceBox(T defaultValue) {
this((Class<T>) Objects.requireNonNull(defaultValue, "defaultValue must not be null!").getClass());
setValue(defaultValue);
}
public EnumChoiceBox(Class<T> enumType, T defaultValue) {
this(enumType);
setValue(defaultValue);
}
}
public interface DisplayName<T extends Enum<T>> {
public default String toDisplayName() {
return this.toString().replace('_', ' ').toLowerCase();
}
}
В принципе, все работает, и компилятор также удовлетворен первым и третьим конструктором.Однако мне кажется, что два аргумента в третьем конструкторе не нужны: этого должно быть достаточно для передачи значения по умолчанию, поскольку оно уже содержит информацию о классе.
Итак, это то, чего я пытался достичь с помощьювторой конструктор, но там я получаю предупреждение, что сделал непроверенный актерский состав.Есть ли способ решить / обойти эту проблему (кроме простого подавления предупреждения)?