2010-08-15 69 views
4

我写了一个扩展Iterator [A]的自定义特征,我希望能够使用我在Iterator [A]上编写的方法,它是从另一种方法返回。这可能吗?Scala:将返回类型转换为自定义特征

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

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

我仍然在试图让我周围的整个implicits事头,没有多喜欢写在Bar对象定义的方法。我会如何去包装这样一个项目,以我想要的方式工作?

回答

6

想通了。带了我几个尝试去了解:

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

我完成了。非常短暂。

+1

可能是一个好主意,可以调用'iterator2increment' – 2010-08-16 12:08:54

2

我不认为这是可能的没有玩技巧。 mixin继承发生在编译时,它可以静态地进行类型检查,并且总是针对另一个类,特征等。在这里,您尝试在运行时“在运行中”处理现有对象上的特征。

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

+0

我觉得必须有一个隐式转换才能解决这个问题。然而,解决方案继续避开我。 – wheaties 2010-08-15 22:24:55