Rog*_*ews 16 java generics enums
我有一个枚举
public enum Days {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
Run Code Online (Sandbox Code Playgroud)
}
我想创建一个可以获取类型为days的值的类.所以我使用了Java Generics
public class State<T extend Days>
Run Code Online (Sandbox Code Playgroud)
但是有一个错误
The type parameter T should not be bounded by the final type Days.
Final types cannot be further extended
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
枚举是最终类型,这意味着,您无法从它们扩展
一般类似想要一个Class作为参数,它是Days或扩展类,但扩展类是不可能的
因此,唯一可能的参数是Days,如果只有一个值,则不需要泛型
不要使用泛型绑定.没有必要.只需使用无界类型,如下所示:
public class State<T> {
public State(T startState) {
// whatever
}
}
Run Code Online (Sandbox Code Playgroud)
并使用它:
State<Days> dayState = new State<Days>(Days.SUNDAY);
Run Code Online (Sandbox Code Playgroud)
这是一个简单的类型类,不需要绑定.
可能有意义的唯一界限是绑定到enum
:
public class State<T extends Enum<T>> {
public State(T startState) {
// whatever
}
}
Run Code Online (Sandbox Code Playgroud)
此版本要求通用参数为a enum
.使用此版本,上面的用法示例仍然可以编译,但这不会编译(例如):
State<String> dayState = new State<String>("hello");
Run Code Online (Sandbox Code Playgroud)
因为String
不是enum
.
你不能在java中扩展枚举(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html到最后).因此是不可能的.
-IF你需要你的班级只用你的enum工作,你不需要泛型
- 相反,你需要它与其他枚举(它有意义吗?)你不需要指定扩展.
你的国家班级到底做了什么?
这里要做的是
public enum Days{..}
public class State { // no generic argument!
...
}
Run Code Online (Sandbox Code Playgroud)
既然这样,你不能State<T extends Days>
因为满足的唯一途径T extends Days
是拥有T
可以 Days
.这意味着什么Days
是final
.
因此,您应该制作State
非通用的,并Days
直接在您尝试使用的任何地方使用T
.你不能声明public class State<Days>
,因为它会尝试将其Days
视为一个类型变量,而不是作为类Days
,而这不是你想要的.