在Java中使用Enum的泛型

时间:2012-02-13 08:08:52

标签: java generics enums

我有一个枚举

public enum Days {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY 

}

我想创建一个可以获取类型为days的值的类。所以我使用了Java Generics

public class State<T extend Days>

但是有一个错误

The type parameter T should not be bounded by the final type Days. 
Final types cannot be further extended

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:9)

枚举是最终类型,这意味着,您无法从它们扩展

类似泛型想要一个Class作为参数,它是Days或扩展类,但扩展类是不可能的

因此,唯一可能的参数是Days,如果只有一个值,则不需要泛型

答案 1 :(得分:7)

不要使用泛型绑定。没有必要。只需使用无界类型,如下所示:

public class State<T> {
    public State(T startState) {
        // whatever
    } 
}

使用它:

State<Days> dayState = new State<Days>(Days.SUNDAY);

这是一个简单的类型类,不需要绑定。

可能有意义的唯一界限是绑定到enum

public class State<T extends Enum<T>> {
    public State(T startState) {
        // whatever
    } 
} 

此版本要求通用参数为enum。使用此版本,上面的用法示例仍然可以编译,但这不会编译(例如):

State<String> dayState = new State<String>("hello");

因为String不是enum

答案 2 :(得分:5)

您不能在java中扩展枚举(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html到最后)。因此是不可能的。

-IF你需要你的班级才能使用你不需要泛型的枚举

- 如果您需要它与其他枚举(它有意义吗?),您不需要指定扩展。

你的国家班级究竟做了什么?

答案 3 :(得分:5)

这里要做的是

public enum Days{..}

public class State { // no generic argument!
  ...
}

目前,您不能拥有State<T extends Days>,因为满足T extends Days的唯一方法是让T 成为 Days。这就是Days final的含义。

相反,您应该使State 泛型,并在您尝试使用Days的任何位置直接使用T。您无法声明public class State<Days>,因为它会尝试将Days视为类型变量,不是类Days,而是你想要什么。

答案 4 :(得分:2)

在Java 6下,这对我编译很好:

public enum Days {
  SUNDAY, 
  MONDAY, 
  TUESDAY, 
  WEDNESDAY,
  THURSDAY, 
  FRIDAY, 
  SATURDAY
}

public class State<T extends Days> {
  T state;

  public State(T startState) {
    this.state = startState;
  }
}

private void test() {
  State<Days> state = new State<Days> (Days.MONDAY);
}

但是,如果您希望State对象从一个enum更改为另一个public class State<S extends Enum<S>> { final ArrayList<S> states = new ArrayList<S>(); private S state; public State(S startState) { states.addAll(EnumSet.allOf(startState.getClass())); this.state = startState; } public S next() { return state = states.get((state.ordinal() + 1) % states.size()); } public S prev() { return state = states.get((state.ordinal() - 1 + states.size()) % states.size()); } public S set(S newState) { return state = newState; } public S get() { return state; } } private void test() { State<Days> state = new State<Days> (Days.MONDAY); // ... } ,最好使用以下内容:

{{1}}