Почему эта ссылка неоднозначна?

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 ответа

Решение

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

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

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

С помощью getMousePosition() должно работать так же.

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

peer.getMousePosition()
Другие вопросы по тегам