用于实现枚举的方法签名的Java泛型类型

时间:2018-02-16 12:30:51

标签: java enums interface

我基本上想要一个具有特定方法的enum,例如

public interface PropertyTypeMethods {
    public int getTypeId();

    public void setTypeId(Integer typeId);
}

等等

public enum BasePropertyTypes implements PropertyTypeMethods {

ONE, TWO;

private int typeId;

@Override
public int getTypeId() {
    return typeId;
}

@Override
public void setTypeId(Integer typeId) {
    this.typeId = typeId;
}

}

以及此枚举的扩展版本,例如

public enum ExtendedPropertyTypes implements PropertyTypeMethods {
HUNDRED, THOUSEND; 
// same as above
}

会导致ONE.setTypeId(1) ==> ONE.getTypeId()==1 //true。这是基本概念。但现在我想调用一种通用的方法,例如。

private <E extends Enum<E> & PropertyTypeMethods> void initEnum(Enum<E> curType) {
   // the below approach does not work :-/
   curType.setTypeId(1); // or any other reasonable value....

但不知怎的,我无法弄清楚正确的方法签名是什么。在此之后question我至少想到了一些难题 -  但仍然没有得到它的方法签名。仍然不清楚如何在签名中正确指定curType以执行适当的调用。

2 个答案:

答案 0 :(得分:1)

正确的签名只是

private void initEnum(PropertyTypeMethods onject) {
    object.setTypeId(1);
}

但正如Andy Turner所提到的,枚举预计将是不可改变的,即只有最终不可变的领域。因此,枚举也有一个构造函数Enum Types

如果你有更复杂的枚举,那么按照以下方式实现它们是常用的方法

public enum BasePropertyTypes implements PropertyTypeMethods {
   ONE (new PropertyTypeMethods() {
          @Override
          public int getTypeId() {
              return 1;
          }
     });

    private final PropertyTypeMethods m;

    BasePropertyTypes(PropertyTypeMethods m) {
       this.m = m;
    }

   @Override
   public int getTypeId()
   {
      return this.m.getTypeId();
   }
}

但是从你的例子中,我建议你回顾一下你的实际问题。根本不适合使用枚举。

答案 1 :(得分:1)

这将有效:

private <E extends Enum<E> & PropertyTypeMethods> void initEnum(E curType) {
  curType.setTypeId(1);
}

然而,我并不认为制作可变Enum s是一个好主意(它们意味着是恒定值的标签,而不是带状态的单身人士)。此外,你不应该&#39;编写需要Enum参数的方法时,他们应该关心的是它的接口:

// This will be easier to work with down the road
private void initEnum(PropertyTypeMethods curType) {
  curType.setTypeId(1);
}