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