我有一个枚举
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
我该如何解决这个问题?
答案 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}}