Scala:リターンタイプをカスタム特性に変換します
-
28-09-2019 - |
質問
イテレーター[a]を拡張するカスタム特性を書きました。別の方法から返されるイテレーター[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
オブジェクト定義。上記のように作業するようにそのようなアイテムを包むにはどうすればよいですか?
解決
理解した。私に数回理解しようとしました:
object Increment{
implicit def convert( input:Iterator[String] ) = new Increment{
def next() = input next
def hasNext() = input hasNext
}
}
そして、私は終わりました。とても驚くほど短い。
他のヒント
トリックをプレイせずにこれが可能であるとは思わない。ミックスイン継承は、コンパイル時に静的にタイプチェックできる場合に発生し、常に別のクラス、特性などをターゲットにします。ここでは、実行時に「その場で」既存のオブジェクトに特性をタックしようとします。
暗黙的な変換、あるいはプロキシなどの回避策があります。おそらく「最もクリーンな」方法は、基礎となるイテレーターに委任するラッパークラスを増分することです。ユースケースに応じて、他の解決策があるかもしれません。
所属していません StackOverflow