- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下情况:
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 ambiguity和 implicit divergence是不同的。
关于类型 X
的隐式应该转到 X
的伴生对象。因此,如果这是 A
和 String
之间的隐式转换,它应该转到 A
的伴生对象。但是你对 .getSimpleName
有疑问。
常用方法是参数化伴随对象的父特征(如@MarioGalic advises ):
如果你不想让 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/
我正在使用 Fortran90,但我对它不太熟悉。 在代码的某些地方,我想在 t0 和 tf 之间创建一个由 n 个线性等距点组成的数组,所以我尝试了以下方法: t = t0+(/(i,i=0,n-1
我试图弄清楚为什么在数组构造函数内的 do 构造之前放置标量会产生它所得到的答案。 我一般理解 do 结构,(/(i,i=1,5)/) 相当于 (/1,2,3,4,5/)。 real, dimensi
我目前遇到的情况是,我需要能够通过应用程序 B 的隐式 Intent 广播来启动应用程序 A。应用程序之间没有数据传递。应用程序 A 被简单地启动,显示特定的 Activity。 我的问题是这样的;从
我是一名优秀的程序员,十分优秀!