2013-05-21 37 views
2

我有一個簡單的容器特質,像這樣:發現scala.Unit,要求單位

trait Handler { 
    def apply[In, Out](in: In): Out 
} 

當我嘗試實現:

new Handler { 
    def apply[Any, Unit](in: Any) = println(in) 
} 

我得到一個錯誤:

[error] found : scala.Unit 
[error] required: Unit(in method apply) 
[error]  def apply[Any, Unit](in: Any) = println(in) 

這是爲什麼?我可以修復這個編譯器錯誤嗎?

+0

可能重複http://stackoverflow.com/questions/16489716/scala-type-parameter-error-not-a-member-of -type-parameter) – senia

+0

它確實聽起來很相似,但我不知道如何解決我的問題。說實話,'Handler'是一個特性,而不是一個類,所以我不會壓倒任何東西,只是實現'apply'。 – pr1001

回答

5

有幾乎相同問題與正確answer

你可以使用特徵類型參數,而不是方法類型參數:

trait Handler[Out] { 
    def apply[In](in: In): Out 
} 

new Handler[Unit] { 
    def apply[In](in: In) = println(in) 
} 
+0

謝謝,這是訣竅。我曾嘗試將「In」和「Out」都作爲特徵類型參數,但這只是讓人覺得很複雜。這工作。再次感謝。 – pr1001

0

首先,你不能創建抽象的(未實現的)方法的類,您應該改變classtraitclass關鍵字前加上abstract

當[R實現應用方法,Unit是這種方法和Scala推斷你的方法scala.Unit的類型的類型變量,因爲它是Predef.println方法的結果類型

+0

對不起,我應該更具體:它實際上是一個特點。至於你的第二點,我該如何避免使用'Unit'類型變量並實際使用'scala.Unit'? – pr1001

0

這個怎麼解決?

trait Handler { 
    type In 
    type Out 

    def apply(in: In): Out 
} 

new Handler { 
    type In=Any 
    type Out=Unit 

    override def apply(in: In):Out = println(in) 
} 
[Scala的類型參數誤差,而不是一種類型的參數構件(的
+0

問題似乎是,輸出類型是類型'Handler.Out',而不是實際使用的輸出類型。 – pr1001

+0

是的,但它是一個單位,您可以毫無問題地分配它:val h:Unit = res0(「ever ever」)(給定res0是Handler創建的結果) – evantill