我有一个地图条目列表,我需要一个返回地图键的迭代。
当然,我们可能天真并将其复制到所需类型的新集合中,但效率低下。
那么让我们看看我们是否可以使用泛型提供现有结构的视图。是的,我能够做到这一点,但它并不完美:当它传递给期望Iterable< K>的函数时,它会提供未经检查的转换。是否可以改进以避免这些警告?
也许它可以实现Iterable< K>类似于注释掉的行,这是我尝试但无法完成的路径。你能弄清楚类似但正确(没有使用警告)的通用实现吗?
这应该有助于演示如何使用ListKeyIterable:
列表与LT; 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() ); }
}
答案 0 :(得分:2)
import java.util.*;
class ListKeyIterable<K,V> implements Iterable<K> {
List<Map.Entry<K,V>> list;
public ListKeyIterable(List<Map.Entry<K,V>> list) {
this.list = list;
}
@Override public Iterator<K> iterator() {
class ListKeyIterator<K> implements Iterator<K> {
Iterator<Map.Entry<K,V>> iterator;
public ListKeyIterator( Iterator<Map.Entry<K,V>> 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 UnsupportedOperationException( "ValueListIterator remove() not implemented." );
}
}
return new ListKeyIterator<K>( list.iterator() );
}
}
答案 1 :(得分:1)
事实证明我只需要通用两种类型的参数化,如下所示:
class ListKeyIterable<K,T extends List<? extends Map.Entry<K,?>>> implements Iterable<K>