あなた自身が観察したように、いつもforeach
をiterator
として実装できます。逆の場合は当てはまりません。foreach
しかない場合は、一般的にiterator
を実装できません。これを行う唯一の方法は、終了するまでforeach
を実行し、要素を別のコレクションに収集し、このコレクションのイテレータを返します。これは、大規模なコレクションでは効率的でなく、無限のコレクションでは完全に不可能です。
しかし、標準ライブラリには実際にはTraversable
ではなく、Iterable
でないものは含まれていません。実際には例を考え出すのは実際には難しいです。基本的には、Traversable
でも可能ですが、反復を可能にするものであればイテレータ内で実現可能ではないいくつかの反復状態を保持する必要がある場合はIterable
ではありません。たとえば、プッシュ型XMLパーサを提供するSAX APIのラッパーがあります。これらのパーサーはコールバック駆動型です。パーサへのコールバックを提供し、解析が終了するまで自動的に実行され、XML構造のさまざまな種類の要素に対応するコールバックオブジェクトのメソッドを呼び出します。 SAXパーサー用にTraversable
ラッパーを作成することはほとんどありません。 Iterable
ラッパーを作成することは不可能です(先に述べたように結果を収集することなく、非常に非効率的です)。一方、JavaSEでは基本的にイテレータベースのStAX APIも提供されているため、StAXパーサーのIterable
ラッパーも非常に簡単に実装できます。
実際、Scalaの著者はまた、Traversable
がそれほど有用ではないことも認識しています。そしてそれがTraversable
がScala 2.13で出荷されるredesigned collections libraryに存在しない理由です。 Traversable
がなぜ悪いのかという別の視点も、hereで見つけることができます。