【问题标题】:Is it possible to create generic enum?是否可以创建通用枚举?
【发布时间】:2017-05-01 20:59:50
【问题描述】:

我正在尝试定义通用枚举,但遇到了问题:

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

};

有可能吗?

【问题讨论】:

  • 为什么要将堆栈放入枚举中?
  • 为什么人们倾向于提出与主题无关的问题?
  • 因为它与主题相关的。
  • @damlur...你会如何使用它?用例是什么?
  • @damular 这个问题是为了让你思考......如果你不知道如何定义该类型并且想不出它应该工作的方式在我们看来,您不能说枚举应该 允许泛型参数。没有定义类型的有效方法,这就是枚举不支持泛型类型的原因。

标签: java generics


【解决方案1】:

枚举是常量。所以Stack disks 不能是“枚举客户端想要的任何类型的堆栈”。它必须是固定类型。

在枚举中包含字段的目的是能够保存有关每个元素的附加信息。例如,在堆栈的情况下,这可能是A("a", "b")B("b", "c", "d") - 每个元素指定在其堆栈中加载的项目(该示例需要一个可变参数构造函数)。但是它们的类型是严格指定的,不能是&lt;T&gt;

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 的键,其中的值是堆栈。我承认使用枚举的字段来做到这一点看起来很诱人,但这不是一个好习惯。枚举最好保持不变。当然,您可以使用我上面的示例来实现您的初始目标,但我建议您使用Map

【讨论】:

  • 谢谢。我知道枚举应该是恒定的。但从技术上讲,它是具有固定数量实例的同一类。所以它应该允许使用泛型。
  • @damular T 应该是什么类型?您无法使用new 运算符创建枚举,那么您将如何定义T 的类型?
  • @damluar 你为什么要你的棍子?堆栈?成为枚举常量?
  • 根据河内游戏,我有三根带有元素的棍子。这就是为什么我希望它是枚举 + 通用
  • @damular 如果你把所有的东西都放在一个类中,那就存在很大的设计缺陷。棍子就是这样(游戏元素或数据),不应有其他职责(如管理堆栈),应由其他类处理(例如处理比赛实例的某些管理器类等)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这可以help。基本上,你需要这个:

    public interface Stick<E extends Enum<E>>
    

    【讨论】:

      【解决方案4】:

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

      希望它能进入 Java 10!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-04
        • 1970-01-01
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多