【问题标题】:A class implementing an interface that takes an enum实现采用枚举的接口的类
【发布时间】:2009-07-14 00:29:48
【问题描述】:

所以,假设我有一个简单的枚举和一个使用它的类:

enum ThingType { POTATO, BICYCLE };

class Thing {
    public void setValueType(ThingType value) { ... }
    public ThingType getValueType() { ... }
}

但是,实际上,我有很多不同的类实现 setValueType,每个类都有不同类型的枚举。我想制作一个这些类可以实现的接口,它使用泛型支持 setValueType 和 getValueType:

interface ValueTypeable {
    public Enum<?> getValueType(); // This works
    public <T extends Enum<T>> setValueType(T value); // this fails horribly
}

我无法更改类模型,因为这些类是从 XML 模式 (JAXB) 自动生成的。我觉得我没有掌握枚举和泛型的结合。这里的目标是我希望能够允许用户从枚举列表中进行选择(因为我已经知道运行时的类型)并在特定类中设置值。

谢谢!

【问题讨论】:

    标签: java generics interface enums


    【解决方案1】:

    您是否尝试过参数化接口本身。喜欢:

    class Thing<E extends Enum<? extends E>> {
      public E getValueType();
      public void setValueType(E value);
    }
    

    然后你让子类扩展具有正确类型的子类:

    class SomeSubClass implements Thing<ThingType> { ... }
    

    【讨论】:

    • 可能不需要担心绑定中的Enum
    • 这确实有效,但 jaxb 接口的代码生成器不支持泛型接口。不过,这可能并不难解决。
    【解决方案2】:

    枚举适用于您拥有一组固定的枚举。当您说每个实现都有自己的实现时,您就不再有固定的集合,并且您尝试使用枚举的方式与您的需求不符。

    您可能对request for Java to be able to have abstract enums 感兴趣。

    【讨论】:

    • 嗯,每个类都有一个与之配对的枚举——绝对是一组固定值。我想要的是这些枚举持有类可以实现的接口,以便我可以通过编程方式识别它们并从接口调用它们。另一种方法是测试每个包含类类型的个体,这将成为可维护性的噩梦。
    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 2013-05-11
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多