繁体   English   中英

是否可以创建通用枚举?

[英]Is it possible to create generic enum?

我正在尝试定义泛型枚举,但有问题:

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);
    }

};

有可能吗?

枚举是常量。 因此, 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

这里有一个通用枚举的草稿: http//openjdk.java.net/jeps/301

希望它成为Java 10!

不,但Enums可以实现接口。 可能对你有帮助。

这可能有所帮助 基本上,你需要这个:

public interface Stick<E extends Enum<E>>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM