Java中的哪个类实现了抽象类EnumSet?
我看到EnumSet.of()返回该类型对象的实例。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,如何获得它的实例?这里有两个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();