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 方法。但是您仍然需要将它们设为字段,您当前的代码在技术上只是将它们视为构造函数参数。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。