我有一个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是对同一个对象的引用。
我的第二个问题是,有一种简单的方法可以解决这个问题吗?
答案 0 :(得分:2)
发生这种情况是因为您用作密钥的实际对象不会使用hashCode()
和equals()
对其进行评估。这些是HashMap
用于查找的方法。处理此问题的常用方法是创建一个包装类,该类将使用objId
和hashCode()
中的内部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);
}
}