java - 枚举中的通用类字段

标签 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;
    }
}

我有这个枚举。 FirstDictionarySecondDictionary工具 DictionaryModel , 它是为了使用此解决方案而设计的标记界面。

现在我很想这样做:

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

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

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

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

我似乎无法在 DAO 本身或 clazz() 中进行任何动态转换方法。我觉得我在这里遗漏了一些明显的东西。

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

最佳答案

作为explained by Jorn Vernee , enum类型不允许这样做。

最简洁的解决方案,让你可以这样写

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

会是

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

    Class<T> clazz();
}

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

关于java - 枚举中的通用类字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48930282/

相关文章:

java - 如何对对象集合进行排序

Java throttle "Consumer"线程

java - 方法在两个泛型类的层次结构中不明确,而方法实际上给出了相同类型的参数

java - 将 `enum constant name` 变回 `enum constant` 的通用方法

c# - 如何将泛型类型列表作为参数传递给 xamarin-C#-ios 中 TableSource 的构造函数?

java - 如何跳出Java 8 Iterator.forEachRemaining循环里面的方法?

Java 8 AcceptEither CompletableFuture 示例

java - 公开 JSP 文件中未使用的属性 (Spring)

java - 在 JLayer 上方添加固定大小的 JPanel

java - 当 pitest 找不到测试类时