3

私はインターフェースを持っています

public interface TerminalSymbol {
    // methods ...
}

列挙型

// common usage enum that I need
public enum Common implements TerminalSymbol {
    EPSILON;

    @Override
    // methods ...
}

そして、私は次のようなことをしたいと思います:

enum Term implements TerminalSymbol {
    A, B, C, ...

    @Override
    // methods ...
}

EnumSet<? extends TerminalSymbol> terminalSymbols = EnumSet.allOf(Term.class);
terminalSymbol.add(Common.EPSILON); // this line gives me error

そのエラーは(私の場合):

The method add(capture#1-of ? extends TerminalSymbol) in the type AbstractCollection<capture#1-of ? extends TerminalSymbol> is not applicable for the arguments (Common)

を使用すればSet<SomeInterface>、この種のエラーを防ぐことができる (そして、正式な文法を表すクラスの開発を続行できる) ことがわかりましたEnumSetが、HashSet. どうすればこの問題を解決できますか?

4

3 に答える 3

4

EnumSet には、1 つの列挙型クラスのメンバーのみを含めることができます。

Java APIドキュメントから:

列挙型セット内のすべての要素は、セットの作成時に明示的または暗黙的に指定された単一の列挙型から取得する必要があります。

お気づきのように、代替手段は を使用することSet<TerminalSymbol>です。

于 2013-05-16T18:54:21.767 に答える
3

EnumSet単一の列挙型のメンバーを厳密に含むという重要な制約から効率を引き出します。これordinalは、基本的にBitSet. 残念ながら、複数の列挙型が必要な場合、その利点を享受することはできません。

この目標に最も近いのは、すべての列挙型で異なる独自の番号付けスキームを考案し、BitSetそれらを効率的に格納するために a を使用することです。

于 2013-05-16T18:58:17.047 に答える
0

EnumSetSetのみのインターフェイスの特別な実装ですenums。の 1 つのインスタンスはEnumSet、その実装が列挙型に基づいているため、特定の列挙型でのみ機能しordinalます。

EnumSetのために作成しTerm、そこに の列挙型メンバーを追加しようとしましたCommon。これは明らかに不可能です。EnumSetfor を作成するCommonか、両方の列挙型の要素を格納したい場合は、他の実装を使用する必要がありSetます HashSet

于 2013-05-16T18:56:46.670 に答える