【问题标题】:Why is this reference ambiguous?为什么这个引用模棱两可?
【发布时间】:2011-09-21 11:05:37
【问题描述】:
import swing._

object PeerTest extends SimpleSwingApplication {
  def top = new MainFrame {
    val p = peer.getMousePosition 
  }
}

给予

error: ambiguous reference to overloaded definition,
both method getMousePosition in class Container of type (x$1: Boolean)java.awt.Point
and  method getMousePosition in class Component of type ()java.awt.Point
match expected type ?
val p = peer.getMousePosition

但添加类型

val p: Point = peer.getMousePosition 

没问题。为什么?

编辑:导致问题:

class A {
  def value() = 123
}

class B extends A {
  def value(b: Boolean) = 42  
}

object Main extends App {
  println ((new B).value) 
}

不会导致问题:

class A {
  def value() = 123
  def value(b: Boolean) = 42  
}

class B extends A {}

object Main extends App {
  println ((new B).value) 
}

所以我认为答案必须解释为什么它只在方法位于不同类时发生。

【问题讨论】:

    标签: scala scala-swing


    【解决方案1】:

    getMousePosition 有两种方法,一种不带布尔参数,另一种带布尔参数。

    如果没有类型注释,Scala 不知道您是想要在一个参数中引用方法(Function1 对象)还是要调用不带参数的方法(导致 Point)。

    指定预期的类型可以阐明您的意图。

    使用getMousePosition() 应该也可以。

    【讨论】:

    • 所以如果我们决定向一个类添加重载方法,我们可以破坏人们的代码......这看起来不太好。我认为在方法后面加上_ 是使其成为部分应用函数的方法。
    • @Luigi 有很多方法可以通过添加重载来破坏人们的代码,这只是另一种方法。
    • @Daniel @retronym 可能有理由避免重载,但我不认为这种情况是模棱两可的,因为如果零参数重载不存在,它不会被解释为函数(除非添加了_)。对我来说它看起来像一个错误,除非出于某种原因我不知道它为什么会这样。
    【解决方案2】:

    引用所需的重载替代项的更直接方法是包含空参数列表。

    peer.getMousePosition()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 2023-03-24
      • 2013-06-21
      • 2016-03-08
      • 1970-01-01
      • 2018-05-28
      • 1970-01-01
      相关资源
      最近更新 更多