Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么在这段代码中对重载定义有不明确的引用?_Scala_Overloading_Overload Resolution - Fatal编程技术网

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,所以我现在真的不知道该选择哪一个-您最好检查一下,否则,如果我只选择一个,您可能无法在运行时获得您想要的结果