我尝试编写这个界面
@SuppressWarnings({"unchecked", "rawtypes"})
public interface Command<T extends Enum<T> & Command> {
default public T getCommand(String cmd) {
final Class<? extends Enum> enumType = T.class;
return T.valueOf(enumType, cmd);
}
}
但无法编译。为什么?
我想使用这个接口(interface)来实现 Enum,如下所示:
public enum RestCommand implements Command<RestCommand> {
GET, PUT, POST, DELETE;
}
最佳答案
因为type erasure ,您不能像调用类的静态成员那样调用类型变量的方法:
String.class // OK
T.class // Compiler error, because T is unknown at compile time.
您可以通过将 enumType
作为参数传递给该方法来解决此问题:
public interface Command<T extends Enum<T> & Command<T>> {
default public T getCommand(String cmd, Class<T> enumType) {
return Enum.valueOf(enumType, cmd);
}
}
但目前还不清楚您通过此获得了什么:在您的枚举
中,您现在需要一个枚举实例来访问枚举实例:
GET.getCommand("POST", RestCommand.class);
这很尴尬:您不需要 GET
来获取 POST
。
基本上,enum
不应该实现 Command
接口(interface);它实际上是一个CommandFactory
(或类似的东西):
class RestCommandFactory implements CommandFactory<RestCommand> {}
因为您使用它来获取 RestCommand
的实例。
关于java - Java 接口(interface)上应用的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40236110/