我正在尝试定义泛型枚举,但遇到问题:
private enum Stick<T>{
A, B, C;
private Stack<T> disks = new Stack();
public void print(){
System.out.println(this.name() + ": " + disks);
}
public T pop(){
return disks.pop();
}
public void push(T element){
disks.push(element);
}
};
有可能吗?
答案 0 :(得分:11)
枚举是常量。所以Stack disks
不能是“枚举客户端所需的任何类型的堆栈”。它必须是固定类型的。
在枚举中包含字段的目的是能够保存有关每个元素的其他信息。例如,在堆栈的情况下,这可以是A("a", "b")
,B("b", "c", "d")
- 每个元素指定在其堆栈中加载哪些项(该示例需要varargs构造函数)。但是他们的类型是严格规定的,不能是<T>
。
eclipse编译器显示的错误很明显:
语法错误,枚举声明不能有类型参数
但是,您可以这样做:
enum Foo {
A("foo", "bar"),
B(0, 1, 2);
private Stack<?> stack;
private <T> Foo(T... args) {
stack = new Stack<T>();
stack.addAll(Arrays.asList(args));
}
public <T> Stack<T> getStack() {
return (Stack<T>) stack;
}
}
然后:
Stack<String> stack1 = Foo.A.getStack();
Stack<Integer> stack2 = Foo.B.getStack();
System.out.println(stack1);
System.out.println(stack2);
结果:
[foo, bar]
[0, 1, 2]
更新:由于您对目标的评论 - 河内大厦不应该是枚举,因为它们的价值正在发生变化。相反,您应该使用枚举作为Map
的键,其中值是堆栈。我承认使用枚举字段来做这件事看起来很诱人,但这不是一个好习惯。 Enum最好保持不变。当然,您可以使用上面的示例来实现您的初始目标,但我建议使用Map
。
答案 1 :(得分:0)
不,但Enums可以实现接口。可能对你有帮助。
答案 2 :(得分:0)
这可以help。基本上,你需要这个:
public interface Stick<E extends Enum<E>>
答案 3 :(得分:0)
这里有一个通用枚举的草稿: http://openjdk.java.net/jeps/301
希望它成为Java 10!