为什么这个参考模糊不清?

时间:2011-09-21 11:05:37

标签: scala scala-swing

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

所以我认为答案必须解释为什么只有当方法在不同的类中时才会出现。

2 个答案:

答案 0 :(得分:9)

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

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

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

使用getMousePosition()也应该有用。

答案 1 :(得分:4)

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

peer.getMousePosition()