簡體   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