如何声明其键可以包含任何枚举的Map?
例如,我有两个水果和蔬菜。
如何声明地图哪里的钥匙可以是水果和蔬菜,但只有枚举,而不是对象?
我的意思是,像
Map<???, String> myMap...
答案 0 :(得分:18)
您可以使用java.lang.Enum
作为密钥。
enum Fruit {
Apple
}
Map<java.lang.Enum<?>, String> mp = new HashMap<>();
mp.put(Fruit.Apple, "myapple");
创建要在枚举中实现的界面。这种方法可以让您获得更多控制权。
interface MyEnum{}
enum Fruit implements MyEnum {
Apple
}
Map<MyEnum, String> mp = new HashMap<>();
mp.put(Fruit.Apple, "myapple");
答案 1 :(得分:8)
如果要声明两个类型的实例可以作为键的映射,则需要为两个枚举设置一个公共超类型。地图只能有一种键类型,但如果你有一种类型有两种子类型,那就没关系。
您无法更改枚举的超类(它总是java.lang.Enum
),但您可以使它们实现接口。所以你能做的就是:
interface FruitOrVegetable {
}
enum Fruit implements FruitOrVegetable {
}
enum Vegetable implements FruitOrVegetable {
}
class MyClass {
Map<FruitOrVegetable, String> myMap;
}
问题是:您可以在界面中包含的枚举水果和蔬菜的共享行为是什么。没有行为的界面是毫无意义的。您经常需要进行instanceof
检查和强制转换,以便将某些内容视为Fruit
或Vegetable
。
也许在您的情况下,您实际上需要一个枚举FruitOrVegetable
- 如果您希望能够互换地对待它们。