枚举中的通用类字段

Sha*_*dov 4 java generics java-8

public enum Dictionaries {
    FIRST_DICTIONARY(FirstDictionary.class),
    SECOND_DICTIONARY(SecondDictionary.class);

    private Class<? extends DictionaryModel> clazz;

    private Dictionary(Class<? extends DictionaryModel> clazz) {
        this.clazz = clazz;
    }

    public Class<? extends DictionaryModel> clazz() {
        return this.clazz;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有这个枚举。FirstDictionarySecondDictionary实现DictionaryModel,这是为了使用此解决方案的标记接口。

现在我很想这样做:

Class<FirstDictionary> clazz = Dictionaries.FIRST_DICTIONARY.clazz();

这种设计显然是不可能的,我想不出实现这一目标的方法。有没有办法做到这一点?我可以访问整个代码,因此我可以修改所有内容,包括界面(甚至删除它)。

我简化了所有这一切,重点是每个字典都是一个数据库表,我有一个通用的 DAO(而不是每个字典的 DAO),现在我必须转换我想避免的每次读取的结果。我知道通用 DAO 不是一个好主意(或者根本不是 DAO)。

Optional<DictionaryModel> entity = dao.getByValue(Dictionaries.FIRST_DICTIONARY, value);

即使对于任何动态转换,在 DAO 本身或clazz()方法中,我似乎也无法解决。我觉得我在这里遗漏了一些明显的东西。

我很欣赏任何想法,甚至完全改变设计。

Hol*_*ger 5

正如Jorn Vernee解释的enum类型不允许这样做。

最简洁的解决方案允许您编写类似

Class<FirstDictionary> clazz = Dictionaries.FIRST_DICTIONARY.clazz();
Run Code Online (Sandbox Code Playgroud)

将是

public interface Dictionaries<T extends DictionaryModel> {
    Dictionaries<FirstDictionary>  FIRST_DICTIONARY  = () -> FirstDictionary.class;
    Dictionaries<SecondDictionary> SECOND_DICTIONARY = () -> SecondDictionary.class;

    Class<T> clazz();
}
Run Code Online (Sandbox Code Playgroud)

但是您可能会重新考虑是否getByValue真的需要接收一个enum常量作为参数而不是Class<T extends DictionaryModel>首先接受 a 。

  • @Jessy,由于 lambda 表达式仅适用于函数式接口,即具有一个抽象方法的接口,因此您必须使用匿名内部类来实现具有两种方法的接口。 (2认同)