scala - 为什么当 B 扩展 A 时,类型为 A 和 B 的范围内隐式值不模棱两可?
问题描述
为什么Test2
即使我们显然有模棱两可的隐含值,代码也会编译?
object Method {
def foo(implicit i: A): Unit = println(i.i)
}
trait A {
val i: Int
}
class B(override val i: Int) extends A
object Test1 {
implicit val i1: A = new A {
val i: Int = 20
}
}
object Test2 {
implicit val i2: B = new B(10)
import Test1._
// This compiles fine and prints 10
Method.foo
}
object Test3 {
implicit val i2: A = new B(10)
import Test1._
// This does not compile, get `ambiguous implicit values`
Method.foo
}
解决方案
Test2
里面没有歧义。i2
具有比 更具体的类型i1
,因此i2
具有比 更高的优先级i1
。
在Test3
i1
和i2
具有相同的类型A
,所以这是歧义。
推荐阅读
- java - Extract all possible field paths from Java Protocol Buffers
- javascript - Unexpected keyword 'true' while using `useState` in react?
- user-interface - Whenever I use the Text object in JavaFX, all object overlap the text, even subsequent text objects
- python - 使用现有模型对 word2vec 嵌入进行 PCA
- javascript - Remove the specific character( $#39;) from object/ array with JavaScript
- sql - 添加列以计算唯一 ID 的记录
- f# - F# On Server and Database
- excel - Conditional Formatting - Subscript Out of Range
- angular - Angular html refer to Class name defined in ts
- c# - Cast Microsoft.Azure.Storage.Blob.CloudBlobContainer to Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer