8
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) 
}

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

4

2 回答 2

11

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

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

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

使用getMousePosition()应该也可以。

于 2011-09-21T11:18:23.400 回答
4

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

peer.getMousePosition()
于 2011-09-21T11:22:47.783 回答