在Java中使用Enum的泛型

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)

我该如何解决这个问题?

Hac*_*chi 9

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

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

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


Boh*_*ian 8

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

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.

  • 这不是OP想要的.OP想要只接受Days,而不是任何内容或任何枚举.他不仅不需要仿制药,他根本不需要使用仿制药. (7认同)

fpa*_*ici 5

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

-IF你需要你的班级只用你的enum工作,你不需要泛型

- 相反,你需要它与其他枚举(它有意义吗?)你不需要指定扩展.

你的国家班级到底做了什么?


Lou*_*man 5

这里要做的是

public enum Days{..}

public class State { // no generic argument!
  ...
}
Run Code Online (Sandbox Code Playgroud)

既然这样,你不能State<T extends Days>因为满足的唯一途径T extends Days是拥有T 可以 Days.这意味着什么Daysfinal.

因此,您应该制作State 通用的,并Days直接在您尝试使用的任何地方使用T.你不能声明public class State<Days>,因为它会尝试将其Days视为一个类型变量,而不是作为类Days,而这不是你想要的.