枚举中的 Java 有界类型参数

标签 java

我正在尝试创建以下枚举。

public enum MyEnum{
     LEAD {
       @Override 
       public boolean isValid(Lead lead) { //compile error, asks to retain type as T
       }
     },
     TASK {
       @Override 
       public boolean isValid(Task task) { //compile error, asks to retain type as T
       }
     };

     public abstract <T extends SObject> boolean isValid(T  object);
}

LeadTask 类都扩展了 SObject。我的目的是基本上让客户能够使用 MyEnum.LEAD.isValid(lead)MyEnum.TASK.isValid(task)。编译器不应允许传递其他类型。

有人可以帮助理解为什么会发生这种情况吗?

谢谢

最佳答案

您需要使用相同的泛型方法覆盖泛型方法。如果您想做您所要求的事情,您需要一个通用的 - 其中 enum不可能。

重点是我指的是enum通过类引用 - 即

final MyEnum myenum = MyEnum.LEAD;

现在如果我打电话 myenum.isValid()我应该能够使用 any SObject 来调用它由您的 abstract 定义方法。
您拥有的通用方法定义实际上没有执行任何操作。它所做的只是捕获传入的类型 SObject并将其存储为T 。例如,通用方法通常用于将参数类型绑定(bind)在一起

<T> void compare(Collection<T> coll, Comparator<T> comparator);

这里我们不关心什么T实际上是 - 我们所需要的只是 Comparator可以比较 Collection 中的内容.

您正在考虑的是一个通用类,例如:

interface MyIface<T> {
    boolean isValid(T  object);
}

然后

class LeadValid implements MyIface<Lead> {
    public boolean isValid(Lead object){}
}

您会看到不同之处在于您将拥有 MyIface<Lead> - 您必须声明 MyIface类型 。在 enum如果你只有 MyEnum .

关于枚举中的 Java 有界类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21148584/

相关文章:

java - ServletWrapping Controller URL 抛出 404

Java正则表达式匹配{{双花括号内的字符}}

java - 意外响应代码 303 Volley 错误

Java如何遍历ArrayList的ArrayList?

java - 接收和输出 JSON 错误消息 Android

java - 如何使用 Jsoup 解析相对 url?

java - 如果我想向调用类传递一些信息,最好的方法是什么?

java - 什么是NullPointerException,我该如何解决?

java - 需要一些关于这个正则表达式的帮助

java - 如何在 Kotlin 中将函数式接口(interface)操作作为参数传递?