我试图在Eclipse中扩展EnumSet
以实现Comparable
。但是,我从一开始就充满了错误。这就是我的开始:
package sets;
import java.util.EnumSet;
enum Suits{
SPADE, DIAMOND, CLUB, HEART;
}
class ExtendedEnumSet extends EnumSet<Suits> implements Comparable<Suits> {
}
它立即通知我:Implicit super constructor EnumSet<Suits>() is undefined for default constructor. Must define an explicit constructor.
所以,我按照快速修复方法添加了以下构造函数:
ExtendedEnumSet(Class<Suits> finalArg0, Enum[] finalArg1) {
super(finalArg0, finalArg1);
// TODO Auto-generated constructor stub
}
...然后通知我:The constructor EnumSet<Suits>(Class<E>, Enum[]) is not visible
。我已经尝试更改此类和此构造函数的访问修饰符无效。
下一个问题是当我决定继续并修复Eclipse报告的下一个错误时:The type ExtendedEnumSet must implement the inherited abstract method AbstractCollection<Suits>.iterator()
。当然,这只是冰山一角。我再次使用快速修复(add unimplemented methods
)并添加以下内容:
@Override
public int compareTo(Suits finalO) {
// TODO Auto-generated method stub
return 0;
}
@Override
void addAll() {
// TODO Auto-generated method stub
}
@Override
void addRange(Suits finalArg0, Suits finalArg1) {
// TODO Auto-generated method stub
}
@Override
void complement() {
// TODO Auto-generated method stub
}
@Override
public Iterator<Suits> iterator() {
// TODO Auto-generated method stub
return null;
}
@Override
public int size() {
// TODO Auto-generated method stub
return 0;
}
然后报告The method addAll() of type ExtendedEnumSet must override or implement a supertype method
。它回应了addRange
和complement
的此错误。我可以从addAll
Set
复制public boolean addAll(Collection<? extends Suits> collection)
签名。但是,当我尝试从API文档中复制其他方法签名(addRange
,complement
)时,它们似乎不存在。我不知所措。
我已经选择了EnumMap
,而且效果很好。 EnumSet
似乎是不可能的。我错过了什么吗?
答案 0 :(得分:6)
简短回答:EnumSet
并非旨在扩展到java.util
包之外。
答案很长:EnumSet
有两个实现:MiniEnumSet
和HugeEnumSet
。迷你版优化为使用单个long
来表示值;巨大的使用多个长。这些类在JRE中“隐藏”,因此调用代码不知道区别。这就是EnumSet提供许多静态工厂方法来创建新实例的原因。这是防止脆弱基类反模式的常见设计模式。
编译器告诉您无法调用该类的超级构造函数,因为开发人员将其标记为 package-private 。因此,您必须将代码打包在java.util
下才能调用它。与您尝试覆盖的其他方法相同。
答案 1 :(得分:0)
我猜EnumSet
从未打算由用户定义的类扩展。查看此方法的签名:
abstract void addAll();
它是抽象的,但它是package-private,因此只有同一个包中的类才能看到(调用或覆盖)此方法。
TL; DL:很遗憾,您无法使用自己的课程扩展EnumSet
,因为这是不可能的。