2010-08-15 78 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

相關問題