我正在尝试创建以下枚举。
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);
}
Lead
和Task
类都延伸SObject
。我的意图是基本上让客户能够使用MyEnum.LEAD.isValid(lead)
或MyEnum.TASK.isValid(task)
。编译器不应允许传递其他类型。
有人可以帮助理解为什么会这样。
由于
答案 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
。