不确定这是否可行,但您可以尝试一下。您可以将隐式分组到容器对象中。
示例:假设您有 X、Y 和 Z 类型的隐式,并且您并不总是想为每个方法添加三个 implicit 参数。假设您为这些定义了一个容器对象:
class MyImplicits(val x:X, val y:Y, val z:Z)
为了允许自动创建MyImplicits 包装器,您需要创建一个从各个隐式中派生它的对象方法。同样,您定义隐式解包方法:
object MyImplicits {
implicit def wrap(implicit x:X, y:Y, z:Z):MyImplicits = new MyImplicits(x, y, z)
implicit def unwrapX(implicit wrapper:MyImplicits):X = wrapper.x
implicit def unwrapY(implicit wrapper:MyImplicits):Y = wrapper.y
implicit def unwrapZ(implicit wrapper:MyImplicits):Z = wrapper.z
}
假设我们有一个这样的方法:
def foo(...)(implicit implicits:MyImplicits) = ...
以下应该有效:
implicit val implicitXIsInScope:X = ...
implicit val implicitXIsInScope:Y = ...
implicit val implicitXIsInScope:Z = ...
foo(...) // MyImplicits should automatically be created
同样,如果MyImplicits 的实例在隐式范围内,您应该能够调用任何需要X 隐式实例的方法,而无需显式解包。
虽然我没有尝试过。请让我知道它是否有效!