RMI - 引用并使用远程对象作为"键"在hashmap中

时间:2015-03-04 15:44:50

标签: java hashmap rmi

我有一个RMI服务器,它导出实现接口的对象,我们称之为“TestInterface”。

然后,客户端可以执行各种任务,在此接口上调用方法。然后,我为其他类型的对象提供了一些其他接口,其中一个方法接受“TestInterface”类型的对象。该方法尝试使用散列图,其中“TestInterface”是键(它存储服务器上所有“TestInterface”对象的散列图,该值是我想要检索的),但无法找到它。我知道这个密钥存在于hashmap中,但由于接口被传递给客户端,然后又回到服务器,它似乎找不到它。

我知道它存在,因为我能够打印出作为hashmap中键的对象的ID,以及传入的“TestInterface”的ID(它们是相同的)。然后我将它们打印出来(使用默认的toString),我得到了这个:

Proxy[TestInterface,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[127.0.0.1:1099](remote),objID:[-38c943f9:14be569cb95:-7ff9, 8183237023004091504]]]]]

Test[UnicastServerRef [liveRef: [endpoint:[127.0.0.1:1099](local),objID:[-38c943f9:14be569cb95:-7ff9, 8183237023004091504]]]]

我可以看到这些是不同的,这可能是我无法查找的原因。但是,它们看起来指向同一个对象(我相信这是因为objectId是相同的)。

我的问题是,为什么我不能在hashmap中查找这个“Key”,其中Key是对同一个对象的引用。

我的第二个问题是,有一种简单的方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

发生这种情况是因为您用作密钥的实际对象不会使用hashCode()equals()对其进行评估。这些是HashMap用于查找的方法。处理此问题的常用方法是创建一个包装类,该类将使用objIdhashCode()中的内部equals()。然后将此包装类用作映射的键​​。

类似的东西:

public Wrapper {
  private Keyclass key;
  ...

  public Keyclass getWrapped() { return key; }

  @Override
  public int hashCode() {
    return key.objID.hashCode();
  }

  @Override
  public boolean equals(Object o) {
    return key.objID.equals(((Wrapped)o).key.objID);
  }
}