我需要定义一个重新定义类似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之类的非正式定义旁边是否有另一种选择?
答案 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);
}
}