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

我不认为这是不可能的,而不是耍花招。mixin 继承发生在编译时,它可以进行静态类型检查,并且总是针对另一个类、特征等。在这里,您尝试在运行时“即时”在现有对象上添加特征。

有一些解决方法,比如隐式转换,或者代理。可能“最干净”的方法是使 Increment 成为委托给底层迭代器的包装类。根据您的用例,可能还有其他解决方案。

于 2010-08-15T22:00:56.767 回答