Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的哪个类实现了抽象类EnumSet?_Java_Enumset - Fatal编程技术网

Java中的哪个类实现了抽象类EnumSet?

Java中的哪个类实现了抽象类EnumSet?,java,enumset,Java,Enumset,我看到EnumSet.of()返回该类型对象的实例。 但我无法确定哪个类实际实现了这个抽象类?如果没有子类化抽象类型EnumSet,如何获得它的实例?这里有两个java类,它们扩展了EnumSet 1. RegularEnumSet 2. JumboEnumSet 您可以使用EnumSet的静态方法创建实例,如EnumSet#noneOf,EnumSet#allOf等,根据条件实际返回RegularEnumSet或JumboEnumSet的实例EnumSet#of内部调用EnumSet#non

我看到EnumSet.of()返回该类型对象的实例。
但我无法确定哪个类实际实现了这个抽象类?如果没有子类化抽象类型EnumSet,如何获得它的实例?

这里有两个java类,它们扩展了
EnumSet

1. RegularEnumSet
2. JumboEnumSet
您可以使用EnumSet的静态方法创建实例,如
EnumSet#noneOf
EnumSet#allOf
等,根据条件实际返回
RegularEnumSet
JumboEnumSet
的实例
EnumSet#of
内部调用
EnumSet#noneOf
。请参阅
Java
中的以下代码,了解
EnumSet#noneOf
的工作原理

public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
    Enum<?>[] universe = getUniverse(elementType);
    if (universe == null)
        throw new ClassCastException(elementType + " not an enum");

    if (universe.length <= 64)
        return new RegularEnumSet<>(elementType, universe);
    else
        return new JumboEnumSet<>(elementType, universe);
}
公共静态枚举集noneOf(类elementType){
枚举[]宇宙=getUniverse(elementType);
if(universe==null)
抛出新的ClassCastException(elementType+“不是枚举”);

如果(universe.length您不直接创建
EnumSet
的实例。这是通过静态工厂方法完成的,例如:

enum Demo { YES, NO, FILENOTFOUND }

EnumSet<Demo> all = EnumSet.allOf(Demo.class);
EnumSet<Demo> notNo = EnumSet.of(Demo.YES, Demo.FILENOTFOUND);
EnumSet<Demo> none = EnumSet.noneOf(Demo.class);
enum Demo{YES,NO,FILENOTFOUND}
EnumSet all=EnumSet.allOf(Demo.class);
EnumSet notNo=EnumSet.of(Demo.YES,Demo.FILENOTFOUND);
EnumSet none=EnumSet.noneOf(Demo.class);
结果集是可变的,即您可以执行以下操作:

EnumSet<Demo> set = EnumSet.noneOf(Demo.class);  // start with an empty set
...
set.add(Demo.YES);
set.remove(Demo.NO);
...
set.clear();
...
EnumSet=EnumSet.noneOf(Demo.class);//从空集开始
...
set.add(Demo.YES);
设置。移除(演示编号);
...
set.clear();
...
用于枚举类型的专用集合实现。枚举集合中的所有元素必须来自在创建集合时显式或隐式指定的单个枚举类型

如果
EnumSet
,则无法创建实例!但也不需要对其进行扩展,因为有一种工厂方法可以从指定的元素创建集合:

public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest)
publicstaticenumset(E-first,E…rest)
它为您创建一个对象。枚举集通常用于组合效果,无论是粗体和下划线等文本样式,还是带有颜色

enum Color { GREEN, RED, BLUE };
EnumSet <Color> yellow = EnumSet.of(Color.RED, Color.GREEN);
enum颜色{绿色、红色、蓝色};
EnumSet yellow=EnumSet.of(Color.RED,Color.GREEN);

您找到了其他信息…

要找到这些信息,您可以查看所有代码,或者打印出作为示例返回的对象的
getClass()
,但更简单的方法是使用IDE

导航到
EnumSet
,然后单击显示实现的图标


这显示了可用枚举集的所有可用子类的列表。

其他答案已经回答了
EnumSet
的哪些具体子类实际实现了抽象类
EnumSet
。当我们没有子类化它

请注意,
EnumSet
没有构造函数,因此不打算像普通类那样使用它:

EnumSet=new EnumSet(…);//不是这样的

相反,要创建一个
EnumSet
,我们使用它的一个静态初始值设定项(例如
of
)。这些初始值设定项将在内部创建一个类型为
JumboEnumSet
(如果枚举常量的数量很大)或
RegularEnumSet
(否则)的对象,并返回该对象的引用

由于
JumboEnumSet
RegularEnumSet
都是
EnumSet
的子类,因此可以将它们分配给
EnumSet
类型的变量(这称为)

这样做的好处是,当我们使用
EnumSet
类型的变量时,我们不必知道我们使用的是哪个具体实现。事实上,
JumboEnumSet
RegularEnumSet
都是包
java.util
中的私有类,因此我们甚至无法直接创建它

您可以进一步了解
EnumSet
是如何通过其源代码在内部实现的(例如,请参阅)


Java中常用类型的另一个例子是
Stream
Stream
实际上是一个接口。

为什么不看看
EnumSet.of()的实现呢
?@azurefrog:您不能实例化抽象类,但可以获得抽象类型的实例。例如,myAbstractClass abs=new myImplementation();这里abs是myAbstractClass类型的实例。请尝试
System.out.println(EnumSet.Noeof(RetentionPolicy.class).getClass();