MapがIterableではない理由(憶測)
疑問
JavaのMapはキーと値のペアの集まりであるとみなせる。
コレクション(集まり)は通常便利のためIterableを実装している。
(実際にはサブインターフェースのCollectionを実装していることが多い)
しかしMapインターフェースはIterableを継承していない。
なぜか?
憶測
憶測になるが、Mapで扱うkey-valueペアは、ユーザーからみると
MapのstaticメンバであるインターフェースMap.Entryであり、
Mapに依存しているからではないかと思った。
Map implements Iterable
参考: Java1.4時代のMapインターフェース
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Map.html#entrySet()
ところでJava標準ライブラリにペア(直積型)がないのはなぜ?
それでもIterableにしたい
Mapを直接拡張for文で処理したい場合は
MapとIterableを継承したインターフェースを定義すればよい。
(インターフェースは多重継承OK)
import java.util.HashMap; import java.util.Iterator; import java.util.Map; interface IterableMap<K, V> extends Map<K, V>, Iterable<Map.Entry<K, V>> {} public class IterableHashMap<K, V> extends HashMap<K, V> implements IterableMap<K, V> { private static final long serialVersionUID = 904402584765006995L; public static void main(String[] args) { IterableMap<Integer, String> map = new IterableHashMap<Integer, String>(); map.put(1, "ichi"); map.put(20, "nijuu"); map.put(300, "sanbyaku"); for (Entry<Integer, String> entry : map) { System.out.println(entry.getKey() + " -> " + entry.getValue()); } } @Override public Iterator<java.util.Map.Entry<K, V>> iterator() { return entrySet().iterator(); } }
実行結果
1 -> ichi 20 -> nijuu 300 -> sanbyaku
問題
Mapを継承するインターフェース
(たとえばConcurrentMap, SortedMap)は当然ながらIterableを実装しない。
その場合はIterableConcurrentMap, IterableSortedMapを作るしかないのか。
ちなみに、EclipseのforeachテンプレートはEntryの型パラメータを