Java 如何为枚举类实现equals和hashcode

Java 如何为枚举类实现equals和hashcode,java,enums,hashmap,Java,Enums,Hashmap,我有一个接口名类型 public interface Types { public String getName(); } 两个枚举类扩展了这个接口,如下所示 public enum AlphaTypes implements Types { Alpha("alpha"),Common("common") private String name; private AlphaTypes(String name) {

我有一个接口名类型

public interface Types
{       
    public String getName();    
}
两个枚举类扩展了这个接口,如下所示

public enum AlphaTypes implements Types
{
    Alpha("alpha"),Common("common")
    private String name;

    private AlphaTypes(String name)
    {
        this.name = name;
    }

    @Override
    public String getName()
    {
        return name;
    }   
}

public enum BetaTypes implements Types
{
    Beta("beta"),Common("common")
    private String name;

    private BetaTypes(String name)
    {
        this.name = name;
    }

    @Override
    public String getName()
    {
        return name;
    }   
}
要求是有一个以类型为键的映射 如
Map


如何实现equals和hashcode,从而使映射键即使对于常见的枚举值也是唯一的?

java.lang.enum
equals()
hashcode()
声明为
final
,因此,试图覆盖它们时会出现编译器错误

也就是说,上面的示例可以按照您的意愿工作-如果您将
AlphaTypes.Common
BetaTypes.Common
添加到
Map
中,您将得到一个包含两个元素的映射:

public static void main( String[] args ) throws Exception
{
    Map<Types,Object> map = new HashMap<Types,Object>();

    map.put( AlphaTypes.Common , "b" );
    map.put( BetaTypes.Common , "b" );

    System.out.println( "size=" + map.size());
}
publicstaticvoidmain(字符串[]args)引发异常
{
Map Map=newhashmap();
map.put(AlphaTypes.Common,“b”);
map.put(BetaTypes.Common,“b”);
System.out.println(“size=“+map.size());
}
尺寸=2


干杯,

为什么不使用某种映射?您是否尝试过将其与默认实现一起使用?引用相等应该很好,因为它们是
enum
s(因此不会有具有相同值的不同实例),而且我看不出为什么默认的
hashCode
不够。请记住,enum成员是单例的,所以==可以作为相等性测试。所有enum类都隐式扩展了java.lang.enum,它最终实现了这两个类。equals使用==并且hashCode使用Object.hashCode。尝试在任何枚举中重写它们,您将得到一个编译器错误,可能重复: