Pav*_*l_K 8 java generics collections enums
如何声明其键可以包含任何枚举的Map?
例如,我有两个enum水果和蔬菜.
如何声明地图哪里的键可以是水果和蔬菜,但只有枚举,而不是对象?
我的意思是,像
Map<???, String> myMap...
Run Code Online (Sandbox Code Playgroud)
afz*_*lex 18
您可以使用java.lang.Enum密钥.
enum Fruit {
Apple
}
Map<java.lang.Enum<?>, String> mp = new HashMap<>();
mp.put(Fruit.Apple, "myapple");
Run Code Online (Sandbox Code Playgroud)创建要在枚举中实现的界面.此方法为您提供更多控制.
interface MyEnum{}
enum Fruit implements MyEnum {
Apple
}
Map<MyEnum, String> mp = new HashMap<>();
mp.put(Fruit.Apple, "myapple");
Run Code Online (Sandbox Code Playgroud)如果要声明两个类型的实例可以作为键的映射,则需要为两个枚举设置一个公共超类型.一个映射只能有一个键类型,但如果你有一个类型有两个子类型,那就没问题.
您无法更改枚举的超类(它始终是java.lang.Enum),但您可以使它们实现接口.所以你能做的就是:
interface FruitOrVegetable {
}
enum Fruit implements FruitOrVegetable {
}
enum Vegetable implements FruitOrVegetable {
}
class MyClass {
Map<FruitOrVegetable, String> myMap;
}
Run Code Online (Sandbox Code Playgroud)
问题是:您可以在界面中包含的枚举水果和蔬菜的共享行为是什么.没有行为的界面是毫无意义的.你经常需要做一些instanceof检查和演员表来处理某事Fruit或作为Vegetable.
也许在你的情况下,你实际上需要一个枚举FruitOrVegetable- 如果你想能够互换地对待它们.