2014-09-13 67 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

相关问题