Java接口,用于强制枚举类型的定义

时间:2011-06-09 11:16:10

标签: java interface enums

我需要定义一个重新定义类似hashset的接口。

所以我有类型get(字节键)的方法。由于我不能使用像String这样的描述性键,我正在寻找一种通用的方法来定义接口的某些实现中可用的键。我想为此使用枚举。但是可以强制在接口中定义这样的Enum吗?

要明确我的意思,让我们看一下实现接口的示例类:

public class ByteHashsetImpl implements ByteHashset {
    public enum Key {
        STATE_A,
        STATE_B,
        STATE_C;
    }

    public enum Value {
        VALUE_A,
        VALUE_B,
        VALUE_C;
    }

    public void get(Key k) {
        /**/
    }

}

我想确保每个实现都定义并使用自己的名为Key和Value的枚举。这样就可以使用ByteHashsetImpl.Key之类的东西来访问键/值,以实现接口的每个实现。

是否有可能或者在编写quideline之类的非正式定义旁边是否有另一种选择?

2 个答案:

答案 0 :(得分:3)

您无法强制执行此类枚举的创建,但您可以强制将类型参数作为枚举:

public interface Frobnicator<E extends Enum<E>> {
  void frobnicate(E value);
}


enum Bar {
  X, Y;
}

class BarFrobnicator implements Frobnicator<Bar> {
  @Override
  public void frobnicate(Bar value) {
    // do stuff
  }
}

在这种情况下,Frobnicator 可以只是重复使用现有的enum课程,但E中的Frobnicator将始终为{ {1}}输入。

答案 1 :(得分:3)

根据Joachim Sauer的建议,您可以拥有Enum类型参数:

public interface MyMap<K extends Enum<K>, V extends Enum<V>> {

    public V get(K key);

}

然后你可以:

public enum StateKeys {

    STATE_A,
    STATE_B,
    STATE_C;

}

public enum StateValues {

    VALUE_A,
    VALUE_B,
    VALUE_C;

}

最后

public class MyStateMap implements MyMap<StateKeys, StateValues> {

    @Override
    public StateValues get(StateKeys key) {
        if (key == StateKeys.STATE_A)
            return StateValues.VALUE_A;
        else if (key == StateKeys.STATE_B)
            return StateValues.VALUE_B;
        else if (key == StateKeys.STATE_C)
            return StateValues.VALUE_C;
        else
            throw new IllegalArgumentException("illegal key " + key);
    }

}