scala之如何将隐式类参数映射到特征变量

Free-Thinker 阅读:11 2024-10-25 08:56:14 评论:0

我遇到了隐式参数和特性的有趣问题。

我有一个抽象类 Parent 隐含地接受一个整数和 2 个其他参数:

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

和将与 Parent 混合并使用隐式的特征 ClassTrait:

trait ClassTrait { 
    val str: String 
    val map: Map[String,String] 
 
    def doSth() = str.length 
} 

所以现在我想做这样的事情(没有关键字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 

在复杂的例子中,我在特征中使用了隐式参数,但由于特征不能有任何参数(没有构造函数),我需要再次声明使用隐式。

感谢您的帮助。

请您参考如下方法:

尝试

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

(见我添加的val)

或者使用案例类。然后它们将是字段。

替代方法可能是不使它们隐式化,并在采用隐式设置它们的伴随对象中使用 apply 方法。但是您仍然需要将它们设为字段,您当前的代码在技术上只是将它们视为构造函数参数。


标签:Scala
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号