Enum中的Java有界类型参数

时间:2014-01-15 21:27:55

标签: 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)。编译器不应允许传递其他类型。

有人可以帮助理解为什么会这样。

由于

1 个答案:

答案 0 :(得分:2)

您需要使用相同的泛型方法覆盖泛型方法。如果你想做你想要的,你需要一个通用的 - enum不能。

关键是我通过类引用引用enum - 即

final MyEnum myenum = MyEnum.LEAD;

现在,如果我拨打myenum.isValid(),我应该可以使用SObject方法定义的任意 abstract来呼叫它。
您拥有的通用方法定义实际上并没有做任何事情。它所做的就是捕获传入的SObject类型并将其存储为T。通用方法通常用于将参数类型联系在一起,例如

<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