-1

私はすべてのことをしたと思いますが、HashMap.get は null を返します。hashCode は同じ整数を返し、equals は true を返し、キーは不変ですが、現在も機能しています。

私は何が欠けていますか?

これが私のコードです:

public enum MyEnum_1 `AA1, AA2, AA3, AA4`;
public enum MyEnum_2 `BB1, BB2, BB3, BB4`;

public void MyClass()
{
  ...
  final MyEnum_1 enum1;
  final MyEnum_2 enum2;

  public int hashCode()
  {
    return (enum1.ordinal() * 100 + enum2.ordinal());
  }
  public boolean equals(MyClass obj2)
  {
    if (obj2 == null) return false;
    else return (enum1.equals(obj2.getEnum1()) && enum2.equals(obj2.getEnum2()));
  }
...
}
...
Map<MyClass, MyOtherClass> mappp = new HashMap<MyClass, MyOtherClass>(); 
...
mappp.put(obj1, other_obj1);
MyClass obj2 = new MyClass(obj1.getEnum1(), obj1.getEnum2());

System.out.println("hashCode: " + (obj1.hashCode() == obj2.hashCode()));
System.out.println("equals: " + obj1.equals(obj2));
System.out.println("Map Size: " + mappp.size());

MyOtherClass other_objjj = mappp.get(obj2);
System.out.println("other_objjj: " + other_objjj);
...

印刷結果は次のとおりです。

hashCode: true equals: true マップ サイズ: 1 other_objjj: null

私が欠けているものを見ることができますか?

4

1 に答える 1

8

メソッドをオーバーライドしていません。equals(Object)オーバーロードしましたequals(MyClass)

次のようにします。

@Override
public final boolean equals(Object obj2)
{
  if (obj2 == this) return true;
  if (!(obj2 instanceof MyClass)) return false;
  MyClass that = (MyClass) obj2;
  return (enum1.equals(that.getEnum1()) && enum2.equals(that.getEnum2()));
}
于 2013-02-06T00:55:13.680 に答える