2014-09-13 70 views
3

我面對隱式參數和tratis有趣的問題。如何將隱式類參數映射到特徵變量?

我有一個抽象類Parent接受一個整數和其他2個PARAMS隱含:所以現在

trait ClassTrait { 
    val str: String 
    val map: Map[String,String] 

    def doSth() = str.length 
} 

abstract class Parent(a: Int)(implicit str: String, map: Map[String,String]) {/*...*/} 

和性狀ClassTrait將與Parent混合,並使用implicits我想這樣做(關鍵字abstract):

class Child(a: Int)(implicit str: String, map: Map[String,String]) extends Parent(a) with ClassTrait { 
    def doSth2 = doSth * 10 
} 

我應該用什麼語法來將隱式參數映射到特徵值?編譯器返回此錯誤:

foo.scala:10: error: class Child needs to be abstract, since: 
value map in trait ClassTrait of type Map[String,String] is not defined 
value str in trait ClassTrait of type String is not defined 
class Child(a: Int)(implicit str: String, map: Map[String,String]) extends Parent(a) with ClassTrait { 
    ^
one error found 

在複雜的例子中,我使用隱參數的特點,但由於特徵不能有任何PARAMS(無構造函數),我需要再次聲明所用implicits。

感謝您的幫助。

回答

3

嘗試

class Child(a: Int)(implicit val str: String, map: Map[String,String]) extends Parent(a) with ClassTrait { 
    def doSth2 = doSth * 10 
} 

(見val我加的)

或者使用case class。然後他們將成爲田野。

另一種方法可以是不讓它們隱式,並在需要隱式設置它們的伴隨對象中使用apply方法。但是你仍然需要使它們成爲字段,你的當前代碼在技術上只是將它們視爲構造器參數。

+0

哇,非常感謝:) – petrbel 2014-09-13 11:29:53

2

您可以促進你的類參數字段,使用VAL關鍵字:

abstract class Parent(a: Int)(implicit val str: String, val map: Map[String,String]) {/*...*/} 

注意「VAL海峽」和「VAL地圖」,而不僅僅是「海峽」和「地圖」。這樣他們將成爲正確的只讀成員併爲您的特質的抽象成員提供實現。

+1

我比你明顯回答了3秒!哈哈:) – samthebest 2014-09-13 11:23:48

相關問題