4

Iterator [A]を拡張するカスタムトレイトを作成しましたが、別のメソッドから返されるIterator[A]で作成したメソッドを使用できるようにしたいと思います。これは可能ですか?

trait Increment[+A] extends Iterator[A]{
    def foo() = "something"
}

class Bar( source:BufferedSource){
    //this ain't working
    def getContents():Increment[+A] = source getLines
}

私はまだ暗黙のこと全体に頭を悩ませようとしていて、Barオブジェクト定義にメソッドを書くようなものはあまりありません。そのようなアイテムを上記のように機能するようにラップするにはどうすればよいですか?

4

2 に答える 2

6

理解した。私にいくつかの理解を試みました:

object Increment{
    implicit def convert( input:Iterator[String] ) = new Increment{
        def next() = input next
        def hasNext() = input hasNext
    }
}

そして、私は終わりました。とても短いです。

于 2010-08-15T22:44:17.347 に答える
2

トリックをしなければこれは不可能だと思います。ミックスインの継承はコンパイル時に発生し、静的に型チェックが可能であり、常に別のクラスやトレイトなどを対象としています。ここでは、実行時に「オンザフライ」で既存のオブジェクトにトレイトを追加しようとします。

暗黙的な変換やプロキシなどの回避策があります。おそらく「最もクリーンな」方法は、Incrementを基礎となるイテレータに委任するラッパークラスにすることです。ユースケースによっては、他の解決策があるかもしれません。

于 2010-08-15T22:00:56.767 に答える