你如何在Java中正确扩展/子类EnumSet?

时间:2014-08-18 19:55:48

标签: java constructor subclass extends enumset

我试图在Eclipse中扩展EnumSet以实现Comparable。但是,我从一开始就充满了错误。这就是我的开始:

package sets;

import java.util.EnumSet;


enum Suits{
    SPADE, DIAMOND, CLUB, HEART;
}

class ExtendedEnumSet extends EnumSet<Suits> implements Comparable<Suits> {

}

(问题1)定义显式构造函数

它立即通知我: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。我已经尝试更改此类和此构造函数的访问修饰符无效。

(问题2)覆盖抽象方法

下一个问题是当我决定继续并修复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。它回应了addRangecomplement的此错误。我可以从addAll Set复制public boolean addAll(Collection<? extends Suits> collection)签名。但是,当我尝试从API文档中复制其他方法签名(addRangecomplement)时,它们似乎不存在。我不知所措。

我已经选择了EnumMap,而且效果很好。 EnumSet似乎是不可能的。我错过了什么吗?

2 个答案:

答案 0 :(得分:6)

简短回答:EnumSet并非旨在扩展到java.util包之外。

答案很长:EnumSet有两个实现:MiniEnumSetHugeEnumSet。迷你版优化为使用单个long来表示值;巨大的使用多个长。这些类在JRE中“隐藏”,因此调用代码不知道区别。这就是EnumSet提供许多静态工厂方法来创建新实例的原因。这是防止脆弱基类反模式的常见设计模式。

编译器告诉您无法调用该类的超级构造函数,因为开发人员将其标记为 package-private 。因此,您必须将代码打包在java.util下才能调用它。与您尝试覆盖的其他方法相同。

答案 1 :(得分:0)

我猜EnumSet从未打算由用户定义的类扩展。查看此方法的签名:

abstract void addAll();

它是抽象的,但它是package-private,因此只有同一个包中的类才能看到(调用或覆盖)此方法。

TL; DL:很遗憾,您无法使用自己的课程扩展EnumSet,因为这是不可能的。

相关问题