我有一個地圖項的列表,我需要一個可返回地圖的鍵的迭代。你可以使這個關鍵可視化的地圖列表視圖更好嗎?
當然,我們可能是天真的,並複製到所需類型的新集合,但效率不高。
因此,讓我們看看我們是否可以使用泛型提供現有結構的視圖。是的,我能夠做到這一點,但並不完美:當它傳遞給期望可重用的函數<K>時,它會提供未經檢查的轉換。是否可以改進以避免這些警告?
也許它可以實現Iterable <K>類似於被註釋掉的線,這是我嘗試但不能完成的路徑。你能弄清楚類似但正確(沒有使用警告)泛型實現嗎?
這應該幫助演示ListKeyIterable如何使用:
名單的Map.Entry <朗<,字符串>>列表;
void traverse(Iterable<Long>) {}
traverse(new ListKeyIterable<List<Map.Entry<Long,String>>>(list);
這是工作代碼,但它在調用traverse()時會給出未經檢查的轉換警告。
class ListKeyIterable<T extends List<? extends Map.Entry<?,?>>> implements Iterable
//class ListKeyIterable<T extends List<? extends Map.Entry<K,?>>> implements Iterable<K>
{
T list;
public ListKeyIterable(T list) { this.list = list; }
class ListKeyIterator<K> implements Iterator<K> {
Iterator<Map.Entry<K,?>> iterator;
public ListKeyIterator(Iterator<Map.Entry<K,?>> iterator) { this.iterator = iterator; }
@Override public boolean hasNext() { return iterator.hasNext(); }
@Override public K next() { return iterator.next().getKey(); }
@Override public void remove() { throw new RuntimeException("ValueListIterator remove() not implemented."); }
}
@Override public Iterator iterator() { return new ListKeyIterator(list.iterator()); }
//@Override public <K> Iterator<K> iterator() { return new ListKeyIterator(list.iterator()); }
}
這可能是更好的適合於http://codereview.stackexchange.com。 – 2011-04-05 20:08:15
很高興知道,謝謝。 – Ron 2011-04-05 21:26:50
爲什麼你使用'?'作爲typename? – mbx 2011-04-06 09:04:46