我有一个类,它采用隐式参数,该参数由类内部方法调用的函数使用。我希望能够覆盖该隐式参数,或者从其源复制隐式参数。举个例子:
def someMethod()(implicit p: List[Int]) {
// uses p
}
class A()(implicit x: List[Int]) {
implicit val other = List(3) // doesn't compile
def go() { // don't want to put implicit inside here since subclasses that override go() have to duplicate that
someMethod()
}
}
我想要的行为是 someMethod() 获取一个隐式参数,该参数是 x 的某些更改版本,这是该类的隐式参数。我希望能够在不更改 x 的情况下将其传递给 A 的构造函数,或者将其重写为我选择的新值。这两种方法似乎都不起作用。也就是说,在前一种情况下它不会复制列表,并且编译器会为后一种情况找到一个不明确的隐式值。有没有办法做到这一点?
我意识到我可以重新定义 go() 中的隐式值,但在我的情况下这不是一个好的选择,因为这个类被子类化了很多次,而且我只想在基类中处理这种隐式更改。所以它不一定需要在构造函数中,但必须在除 go() 以外的方法中。
引入另一种包装类型,只是为了消除歧义:
// badly named, choose something domain-specific
case class ListHolder(theList: List[Int])
def someMethod()(implicit holder: ListHolder) {
val xs = holder.theList
// uses xs ...
}
class A()(implicit xs: List[Int]) {
implicit val other = ListHolder(42 :: xs) // compiles
def go() {
// xs is never considered for the implicit param to someMethod()
// because it's now the wrong type
}
}
这也使得代码更加自我记录,因为这两个隐式变得非常明显not一且相同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)