我有一个 RMI 服务器,它导出实现接口(interface)的对象,我们将其称为“TestInterface”。
然后,客户端可以通过调用此接口(interface)上的方法来执行各种任务。然后,我为不同类型的对象提供了一些其他接口(interface),其中一个方法采用“TestInterface”类型的对象。该方法尝试使用以“TestInterface”为键的 HashMap (它存储服务器上所有“TestInterface”对象的 HashMap ,该值是我想要检索的值),但无法找到它。我知道这个键存在于 HashMap 中,但是由于接口(interface)被传递到客户端,然后又返回到服务器,所以似乎找不到它。
我知道它存在,因为我能够打印出作为 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 是对同一对象的引用。
我的第二个问题是,有没有简单的方法来解决这个问题?
最佳答案
发生这种情况是因为您用作键的实际对象与 hashCode()
和 equals()
的计算结果不同。这些是 HashMap
用于查找的方法。处理此问题的常见方法是创建一个包装类,该类将使用 hashCode()
和 equals()
内的内部 objId
。然后,该包装类将用作 map 的键。
类似于:
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);
}
}
关于java - RMI - 引用并使用远程对象作为 HashMap 中的 "key",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28858670/