使用 Java 中的共享接口迭代枚举(class 对象)

Iterate over enums (the class objects) with shared interface in Java

我有几个实现接口 Word 的枚举。我想生成这些枚举的所有值的列表。

我目前的做法是:

    public Set<Word> allWords() {
        Set<Word> dictionary = new HashSet<>();
        dictionary.addAll(Arrays.asList(Article.values()));
        dictionary.addAll(Arrays.asList(Conjunction.values()));
        dictionary.addAll(Arrays.asList(Verb.values()));
        // And so on...
        return dictionary;
    }

有没有办法迭代这些枚举?我想这将涉及创建一个 Class 对象列表,但我不确定如何将其转换回实际值。

如果相关,Word 和每个枚举都在同一个包(词典)中。

仅当您还不知道枚举时,反思才有意义 (即您必须发现包中的枚举)。

如果您已经知道枚举, 那么您的代码的变体是合理的。

例如:

public List<Word> allWords()
{
    List<Word> returnValue = new LinkedList<>();
    returnValue.addAll(Arrays.asList(Article.values()));
    returnValue.addAll(Arrays.asList(Conjunction.values()));
    returnValue.addAll(Arrays.asList(Verb.values()));
    // And so on...
    return returnValue;
}

我建议List因为 Set 将按名称删除重复项。

编辑: 我的列表建议现在看来没有必要了。

编辑2: 根据评论, 设置并没有我想相信的那么糟糕。 仍然, 您正在将该集合用作“垃圾列表”, 我建议 List 是更好的选择。

您可以使用 Stream API 或普通 for-loop

遍历值
allWords()
   .stream()
   .forEach(System.out::println);
// or
Stream.of(Article.values())
       .map(Article::text) // .text is a method from your interface Word
       .forEach(System.out::println);

但老实说,您正试图用这些枚举做一些奇怪的事情。

你的任务是什么?为什么您要尝试通过枚举来解决它?