Почему эта ссылка неоднозначна?
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()