Java 如何将枚举与超级类型分组

Java 如何将枚举与超级类型分组,java,enums,Java,Enums,我目前在一个项目中工作,我有两个不同的枚举,应该填入数组。也就是说,我的数组应该能够容纳任何一个枚举。我知道不能像对类那样对枚举实现继承 有没有办法将两个枚举分组,以便将它们放入同一个数组中?Java中的An隐式地是该类的子类。与大多数语言一样,Java不支持。因此,枚举不能是任何其他类的子类 共享接口 但是……枚举可以实现接口。因此,定义一个由两个枚举实现的接口 例如,让我们定义一个接口Breed,用于不同的应用程序 package work.basil.demo.multienum; 公共接

我目前在一个项目中工作,我有两个不同的
枚举
,应该填入
数组
。也就是说,我的数组应该能够容纳任何一个枚举。我知道不能像对类那样对枚举实现继承

有没有办法将两个枚举分组,以便将它们放入同一个数组中?

Java中的An隐式地是该类的子类。与大多数语言一样,Java不支持。因此,枚举不能是任何其他类的子类

共享接口 但是……枚举可以实现接口。因此,定义一个由两个枚举实现的接口

例如,让我们定义一个接口
Breed
,用于不同的应用程序

package work.basil.demo.multienum;
公共接口品种
{
}
定义两个枚举中的每一个,它们都实现该接口

一些狗

package work.basil.demo.multienum;
公共犬种
{
澳大利亚牧羊犬、拉布拉多猎犬、边境牧羊犬
}
还有猫

package work.basil.demo.multienum;
公共枚举猫品种
{
缅因州库恩,曼克斯,俄罗斯蓝
}
在示例应用程序中试用它们

package work.basil.demo.multienum;
导入java.util.List;
公共类应用程序
{
公共静态void main(字符串[]args)
{
列出品种=
名单(
博德牧羊犬,
猫咪,俄罗斯蓝,
缅因州猫咪
);
System.out.println(“品种=”+品种);
}
}
跑步的时候

品种=[边境牧羊犬,俄罗斯蓝,缅因州库恩]
哎呀,我现在看到你要一个数组了。同样的道理

package work.basil.demo.multienum;
导入java.util.array;
导入java.util.List;
公共类应用程序
{
公共静态void main(字符串[]args)
{
繁殖=
名单(
博德牧羊犬,
猫咪,俄罗斯蓝,
缅因州猫咪
)
.toArray(新品种[0]);
System.out.println(“brides=“+Arrays.toString(brides));
}
}
在本例中,我们没有在接口
Breed
上定义任何方法。请注意,如果确实在其中添加了任何方法,则两个枚举都必须实现这些方法。如果省略,编译器将通知您

类型和铸造 你在评论中问道:


因此,我的接口将作为“超级类型”工作,而不定义任何要覆盖的内容。我理解正确吗

对。请注意我上一个示例中的数组声明。名为
繁殖
的变量是
繁殖
类型的对象数组(接口)-不是
猫繁殖
枚举对象数组,也不是
狗繁殖
枚举对象数组

你在评论中问道:

如果枚举自己实现一个方法,会发生什么?e、 g.
CatBreed
实现
purr()
方法。即使类型为
品种
,我仍然可以访问此方法吗

不可以。数组中的元素都是
bride
对象。因此,当用作
品种
时,此类对象不会“看到”特定于
猫品种
的任何方法。
品种
对象只会看到在
品种
界面上定义的方法

要访问您的猫的
purr
方法,您必须将对象强制转换为
Breed
对象,以作为对
CatBreed
对象的引用。您首先要使用
instanceof
进行测试

Breed breed = breeds.get( 1 )               // Index of 1 means second item, per annoying zero-based counting. We get `CatBreed.RUSSIAN_BLUE` as seen in the example code above.
if( breed instanceOf CatBreed )             // Test if the object referenced by `breed` happens to be also of type `CatBreed` besides being of type `Breed`.
{
    CatBreed catBreed = (CatBreed) breed ;  // Cast to that other type.
    …                                       // Use the `CatBreed` object named `catBreed` to access methods specific to `CatBreed` enum class.
}
Java16有一个新特性,使铸造自动化

Breed breed = breeds.get( 1 )               // We get `CatBreed.RUSSIAN_BLUE` from earlier example.
if( breed instanceOf CatBreed catBreed )    // Casting is automatic in Java 16 and later.
{
    …                                       // Use the `CatBreed` object named `catBreed` to access methods specific to `CatBreed` enum class.
}
由于模式匹配的进一步工作,未来可能会出现其他相关的漂亮功能



警告:此设计(共享已实现接口的枚举)可能是也可能不是特定设计问题的适当解决方案。为了演示此解决方案的方法,我在给定的示例中忽略了适当性问题。

因此,我的接口将作为“超级类型”工作没有定义任何要重写的内容。我理解正确吗?@Beru Yes。注意我上一个示例中的数组声明。名为
bride
的变量是
bride
类型的对象数组(接口)-不是
catbride
enum对象的数组,也不是
dogbride
enum对象的数组。如果enum自己实现一个方法会发生什么?例如
Cat
实现
purr()
。即使类型是
品种
,我仍然可以访问此方法吗?@Beru否,数组的元素都是
品种
对象。因此,当用作
品种
时,此类对象不会“看到”任何特定于
catbride
的方法。一个
bride
对象只能看到
bride
界面上定义的方法。要访问您的猫的purr方法,您必须将
bride
对象强制转换为
catbride
对象。您首先要使用
instanceof
进行测试。Java 16有一个新特性,使自动铸造。其他相关的漂亮功能可能会在未来出现。搜索堆栈溢出以了解更多信息。