ski*_*iou 3 java constructor extends subclass enumset
我试图扩展EnumSet到Comparable在Eclipse中实现.但是,从一开始我就充满了错误.这是我开始的:
package sets;
import java.util.EnumSet;
enum Suits{
SPADE, DIAMOND, CLUB, HEART;
}
class ExtendedEnumSet extends EnumSet<Suits> implements Comparable<Suits> {
}
Run Code Online (Sandbox Code Playgroud)
它立即通知我: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
}
Run Code Online (Sandbox Code Playgroud)
......然后它通知我: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;
}
Run Code Online (Sandbox Code Playgroud)
然后报告的地方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似乎是不可能的.我错过了什么吗?
简短回答:EnumSet不是为了扩展到java.util包装之外.
答案很长:EnumSet有两个实现:MiniEnumSet和HugeEnumSet.迷你一个被优化为使用单个long来表示值; 巨大的使用多个长.这些类在JRE中"隐藏",因此调用代码不知道区别.这就是EnumSet提供许多静态工厂方法来创建新实例的原因.这是一种常见的设计模式,可以防止脆弱的基类反模式.
编译器告诉您不能调用该类的超级构造函数,因为开发人员将其标记为package-private.因此,您必须将代码打包java.util以调用它.与您尝试覆盖的其他方法相同.