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有一个新特性,使自动铸造。其他相关的漂亮功能可能会在未来出现。搜索堆栈溢出以了解更多信息。