【发布时间】:2021-12-26 04:38:17
【问题描述】:
因此,隐式优先级基于两个因素:一个是关于声明本身具有优先级的范围(范围 A 扩展范围/特征 B,或范围 A 是从具有范围 B 的类型扩展的类型的伴生对象它的伴生对象)。另一个简单地提到 declaration A 比 declaration B 更具体。现在,当我第一次阅读它时,我想到了几种可能的解释,特别是考虑到隐式方法和类型参数的潜在参数(隐式和非隐式)。经验似乎告诉我,这意味着声明 A 的返回值的类型,毕竟类型推断/tapply,是声明 B 的返回类型的子类型。所以,这很好:
class A
class B extends A
implicit val A = new A
implicit val B = new B
implicitly[A]
那为什么不编译呢?
implicit class A(val toInt :Int) {
def ! = (1 /: (2 to toInt))(_ * _)
}
implicit class B(i :Int) extends A(i)
1.!
什么时候做?
class A(val toInt :Int) {
def ! = (1 /: (2 to toInt))(_ * _)
}
class B(i :Int) extends A(i)
implicit val A = { i :Int => new A(i) }
implicit val B = { i :Int => new B(i) }
1.!
这是“编译器以神秘方式工作”的另一种情况吗?
【问题讨论】:
标签: scala implicit-conversion implicit