Почему эта ссылка неоднозначна? - PullRequest
8 голосов
/ 21 сентября 2011
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 

все в порядке.Почему?

edit: вызывает проблемы:

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 ]

10 голосов
/ 21 сентября 2011

Существует два метода getMousePosition один без и один с логическим параметром.

Без аннотации типа Scala не знает, хотите ли вы ссылку на метод в одном параметре (объект Function1)) или если вы хотите вызвать один без параметров (в результате Point).

Указание ожидаемого типа проясняет ваше намерение.

Использование getMousePosition() также должно работать.

4 голосов
/ 21 сентября 2011

Более прямой способ обратиться к желаемой перегруженной альтернативе - включить пустой список аргументов.

peer.getMousePosition()
...