强制子类声明枚举

时间:2014-10-11 12:32:52

标签: java generics enums subclass

我可以强制使用子类来创建枚举吗?

class Document<T extends Enum<T>>{
    Map<T, String> fields;
}
class TextDocument extends Document<TextDocument.Field>{
    public enum Field{
        ...
    }
}

如何强制执行Document的任何实现以在其中包含名为Field的枚举?在上面的示例中,TextDocument可以使用其他枚举(例如GraphDocument.Field)扩展Document,这是不允许的。我该如何创建此限制?我需要对子类强制执行此规则 - &#34;您必须拥有自己的枚举&#34;。这甚至可能吗?通过一些hacky方式?有任何想法吗?

1 个答案:

答案 0 :(得分:1)

简而言之,你不能。但是,您可以强制它返回特定枚举值的数组。您还可以强制枚举实现接口。

public interface SomeInterface {
  // any methods you want to be able to perform on the enums
}

public abstract class SomeSuperClass<T extends SomeInterface> {
  abstract T[] getSome();
}

public class SomeSubclass extends SomeSuperClass<SomeInterface> {
    public enum SomeEnum implements SomeInterface {
      testEnum {
        // interface implementation
      }
    }

    public SomeInterface[] getSome() {
        return SomeEnum.values();
    }
}

这是一个非常尴尬的解决方案,但它确实有效。