作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建以下枚举。
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)
。编译器不应允许传递其他类型。
有人可以帮助理解为什么会发生这种情况吗?
谢谢
最佳答案
您需要使用相同的泛型方法覆盖泛型方法。如果您想做您所要求的事情,您需要一个通用的类 - 其中 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/
我是一名优秀的程序员,十分优秀!