java - Java 接口(interface)上应用的泛型

标签 java rest generics

我尝试编写这个界面

@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/

相关文章:

python - djangorest框架detail_route在get方法中不起作用

Java : How I can get the type of the generic type at runtime

Java泛型类型转换之谜

java - 使用泛型类执行基本算术运算

java - 如何跟踪 Java Web 应用程序中的连接池 - DBMS_APPLICATION_INFO

java - Hadoop:在连续的 mapreduce 任务之间传递数据

c# - Azure blob 存储 - 获取 block 列表以错误的顺序返回未提交的 block

Java Generic - 如何组合静态函数?

java - 如何使 Java Swing 应用程序始终处于后台状态

java - 使用 jQuery ajax 的 RESTful Web 服务