0

我编写了以下自定义 ChoiceBox,它从实现下面我的接口 DisplayName 的通用 Enum 填充自身:

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();
    }
}

基本上,一切正常,编译器也对第一个和第三个构造函数感到满意。但是,在我看来,第三个构造函数中的两个参数是不必要的:传递默认值就足够了,因为它已经包含了类信息。

所以,这就是我试图用第二个构造函数来实现的,但是我收到一个警告,说我做了一个未经检查的演员表。有没有办法解决/解决这个问题(除了抑制警告)?

4

0 回答 0