gpt4 book ai didi

scala - 如何在另一个对象之前的对象中隐含?

转载 作者:行者123 更新时间:2023-12-04 15:43:49 28 4
gpt4 key购买 nike

考虑以下情况:

  trait Companion {

implicit def str(a: A): String =
s"${this.getClass.getSimpleName}: %d" format a.n
}

class A(val n: Int)
object A extends Companion {}

class B(val x: Int, y: Int) extends A(y)
object B extends Companion {}

现在编译下面的代码会触发发散隐式错误:

val b = new B(5, 2)
val s: String = b
println(s)

因为对象 A 和 AA 都在 AA 的默认隐式范围内。这显然是有缺陷的:类 AA 比特征 A 更“精确”,因此它的隐式范围应该具有更高的优先级。不幸的是,因为对象不能相互继承,所以没有办法声明这一点。

所以我的问题是:在不求助于非默认隐式作用域的情况下实现这一目标的最佳方法是什么?

最佳答案

Now compiling the following code will trigger a diverging implicit error:

这不是“发散隐式错误”,而是歧义,implicit ambiguityimplicit divergence是不同的。

关于类型 X 的隐式应该转到 X 的伴生对象。因此,如果这是 AString 之间的隐式转换,它应该转到 A 的伴生对象。但是你对 .getSimpleName 有疑问。

常用方法是参数化伴随对象的父特征(如@MarioGalic advises ):

https://github.com/scala/scala/blob/2.12.x/src/library/scala/collection/generic/GenericCompanion.scala#L30

https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/typeclass.scala#L44

#L84 #L150 #L178

如果你不想让 T 成为类型参数,你可以让它成为类型成员

trait Companion {    
type T <: A
implicit def str(a: T): String = s"${this.getClass.getSimpleName}: %d" format a.n
}

class A(val n: Int)
object A extends Companion {
type T = A
}

class B(val x: Int, y: Int) extends A(y)
object B extends Companion {
type T = B
}

你也可以尝试覆盖隐式

trait Companion {
implicit def str(a: A): String = s"${this.getClass.getSimpleName}: %d" format a.n
}

class A(val n: Int)
object A extends Companion

class B(val x: Int, y: Int) extends A(y)
object B extends Companion {
override implicit def str(a: A): String = super.str(a)
}

trait LowPriorityCompanion {
implicit def str(a: A): String = s"${this.getClass.getSimpleName}: %d" format a.n
}

trait Companion extends LowPriorityCompanion {
override implicit def str(a: A): String = super.str(a)
}

class A(val n: Int)
object A extends LowPriorityCompanion

class B(val x: Int, y: Int) extends A(y)
object B extends Companion

关于scala - 如何在另一个对象之前的对象中隐含?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56719766/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com