4

我试图扩展EnumSetComparable在 Eclipse 中实现。然而,我从一开始就充满了错误。这是我的开始:

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。我尝试更改此类和此构造函数的访问修饰符无济于事。

(问题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 methodaddRange它为和回显此错误complement。我可以从:复制addAll签名。但是,当我尝试从 API 文档复制其他方法签名 ( , ) 时,它们似乎不存在。我不知所措。Setpublic boolean addAll(Collection<? extends Suits> collection)addRangecomplement

EnumMap改用了,效果很好。EnumSet似乎是不可能的。我错过了什么吗?

4

2 回答 2

8

简短的回答:EnumSet不是为了扩展java.util包而设计的。

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

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

于 2014-08-18T20:06:08.777 回答
0

我想EnumSet从来没有打算通过用户定义的类来扩展。查看此方法的签名:

abstract void addAll();

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

TL;DL:不幸的是,您不能EnumSet使用自己的类进行扩展,因为这是不可能的。

于 2014-08-18T20:06:45.977 回答