簡體   English   中英

引用類型依賴項 - 聲明Map.Entry依賴於為TreeMap聲明的泛型類型

[英]Reference type dependency - declare Map.Entry to be dependent on generic types declared for TreeMap

讓我們想象一下這個場景 - 我想在java中使用TreeMap。 它是Colletions框架的一部分,也是SortedMap接口的唯一實現。

public class MyDictionary extends TreeMap<String, String> {
// some code
}

為了遍歷存儲在Dictionary類中的條目,我需要一種Map.Entry。 在代碼中的某個地方(可能是MyDictionary類的方法,或者更可能是包含類的MyDictionary類變量的包裝類中的方法),會有類似的東西:

public void showEntries() {
  for (Map.Entry<String, String> e : dictionary) {
    System.out.println(e.getKey(), e.getValue());  // do something
  }
}

現在的問題有沒有辦法將Map.Entry的泛型類型綁定到為TreeMap聲明的泛型類型?

目標是僅在一個地方定義泛型類型。

如果我決定稍后更改TreeMap中保存的數據類型,我將不必搜索我使用這些類型的所有地方。

上面的例子是一個概念驗證。 請幫忙。

您可以使MyDictionary類具有通用性,使用類型參數來匹配TreeMap

public class MyDictionary<K, V> extends TreeMap<K, V>

然后,您可以在整個班級中引用這些類型參數。 特別:

for (Map.Entry<K, V> e : dictionary) {

或者,如果您知道鍵和值將始終是相同的類型:

public class MyDictionary<E> extends TreeMap<E, E>

for (Map.Entry<E, E> e : dictionary) {

這可以通過使用兩個適配器來實現 - 一個用於Entry,一個用於Iterator。

首先,在Dictionary中,創建Entry適配器,例如:

public static class Entry implements Map.Entry<String, String> {
  private Map.Entry<String, String> entry;

  Entry(Map.Entry<String, String> entry) {
    this.entry = entry;
  }

  @Override
  public String getKey() {
    return entry.getKey();
  }

  @Override
  public String getValue() {
    return entry.getValue();
  }

  @Override
  public String setValue(String value) {
    return entry.setValue(value);
  }
}

為了能夠在foreach循環中使用Dictionary類,您必須實現Iterable接口。 TreeMap沒有實現它。

public class Dictionary extends TreeMap<String, String> implements Iterable<Dictionary.Entry>

您可以像這樣編寫iterator()方法:

@Override
public Iterator<Entry> iterator() {
  return new Iterator<Entry>() {
    Iterator<Map.Entry<String, String>> wrapped = entrySet().iterator();

    @Override
    public boolean hasNext() {
      return wrapped.hasNext();
    }

    @Override
    public Entry next() {
      return new Entry(wrapped.next());
    }

    @Override
    public void remove() {
      wrapped.remove();
    }
  };
}

現在,您可以使用沒有泛型類型的foreach循環:

for (Dictionary.Entry e : dictionary) {
  System.out.println(e.getKey() + " " + e.getValue());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM