繁体   English   中英

RMI-引用并使用远程对象作为哈希图中的“键”

[英]RMI - references and using remote object as a “key” in a hashmap

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

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

我知道它的存在是因为我能够打印出哈希图中作为键的对象的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相同)。

我的问题是,为什么不能在哈希图中查找“密钥”,而密钥是对同一对象的引用。

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

发生这种情况的原因是,您用作键的实际对象与hashCode()equals()值并不相同。 这些是HashMap用于查找的方法。 解决此问题的常用方法是创建一个包装器类,该包装器类将使用hashCode()equals()内部的objId 然后,将此包装器类用作映射的键​​。

就像是:

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);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM