Scala 为什么在这段代码中对重载定义有不明确的引用?
为什么在这段代码中对重载定义有不明确的引用Scala 为什么在这段代码中对重载定义有不明确的引用?,scala,overloading,overload-resolution,Scala,Overloading,Overload Resolution,为什么在这段代码中对重载定义有不明确的引用 class A { def m(a1: A, o2: Any): A = { print("1") a1 } def m(a1: A, a2: A): A = { print("2") a1 } def m(o1: Any, o2: Any): Any = { print("3") o1 } def m(o: Any): Any = { print("4")
class A {
def m(a1: A, o2: Any): A = {
print("1")
a1
}
def m(a1: A, a2: A): A = {
print("2")
a1
}
def m(o1: Any, o2: Any): Any = {
print("3")
o1
}
def m(o: Any): Any = {
print("4")
o
}
}
class B extends A {
def m(b1: B, o2: Any): A = {
print("5")
b1
}
override def m(a: A, o2: Any): B = {
print("6")
this
}
override def m(o1: Any, o2: Any): Any = {
print("7")
o1
}
def m(i: Int): Unit = { print("8") }
}
val a = new A
val b = new B
b.m(a, a)
上面的代码给出了编译错误:
对重载定义的引用不明确
[错误]类型a:a,o2:AnyB的B类中的两种方法m
a1:A、a2:AA类中的[error]和方法m[error]匹配
参数类型A、B
但我的理解是a1:A,a2:AA类中的方法m更具体
类型a:a,o2:AnyB的B类中的方法m
非常感谢您的任何提示。您完全正确-A中m的版本更具体,这实际上就是问题所在 由于您实际上是在b ie.b.ma的实例上调用m,编译器首先检查是否有一个方法与b中的签名匹配。因为b确实有一个通过类型检查的方法,即ma:a,o2:Any:b到目前为止还不错。但是,虽然编译器也检查超类A,但它发现了一个更具体的m.ie.ma1:A,a2:A:A版本 问题是您在B的实例上调用了m,但是您显式地要求编译器找到一个包含两个类型为a的参数的方法。编译器现在不确定您实际要执行的版本,因此出现了编译错误 更好的编译消息可能是: 嘿,我在a的层次结构中发现了一个更高级的m版本,它更好地满足了您的需求,但我看到您在a B而不是a上显式调用了m,所以我现在真的不知道该选择哪一个-您最好检查一下,否则,如果我只选择一个,您可能无法在运行时获得您想要的结果