3

私は 2 つの列挙型を持っています (そして、ユーザーが独自のものを追加できるようにしたいと考えています)。

enum PhoneSensor { A, B };
enum RobotSensor { A, C };  

列挙型を受け取るメソッドで列挙型プロパティを使用しない場合、これはうまく機能します。

public <E extends Enum<E>> void registerSensor(E e) {
    System.out.print(e);
}

しかし、テンプレート E を列挙型 (ここではスイッチで使用するため) として認識させたい場合、「E 型の値を切り替えることはできません」というエラーが表示されます。(Eclipse では、switch(e) の 'e' に赤の下線が引かれています)

public <E extends Enum<E>> void registerSensor(EnumSet<E> eSet) {
    for (E e : eSet) {
        System.out.print("value is ");
        // Cannot switch on a value of type E. 
        // Only convertible int values or enum variables are permitted
        switch(e) {
        case PhoneSensor.A:
            System.out.print(e);
        default:
            return;
        }
    }
}

コンパイル時にテンプレートに関する情報が消去されるという消去について少し理解しているので、それが問題です。しかし、Class clazz を渡したり、インターフェイスを実装したりする私の試みはうまくいきませんでした。これに対する良い解決策は何ですか?

4

1 に答える 1

9

問題は、既知の 1 つのタイプしかオンにできないことです。

あなたの場合、それ自体に欠陥がある複数の可能なタイプを切り替えようとしています。(ユーザーはここでコードにどのように追加することを期待できますか?)

必要なのはインターフェース

interface Sensor {
    void sense();
}

enum PhoneSensor implements Sensor {
    A, B;

    @Override
    public void sense() {
        System.out.println(this);
    }
}

public <E extends Enum<E> & Sensor> void registerSensor(EnumSet<E> eSet) {
    for (E e : eSet) {
        System.out.print("value is ");
        e.sense();
    }
}

このようにして、ユーザーはセンサーを実装する任意の列挙型を追加でき、コードを変更することなく、必要なことを何でも行うことができます。

于 2012-08-02T16:59:22.913 に答える