[英]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.