2011-09-21 150 views
5
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) 
} 

所以我想答案必須解釋爲什麼只有當這些方法在不同的班級出現。

回答

9

有兩種方法getMousePosition一個沒有,一個帶有布爾參數。

沒有類型註釋Scala並不知道您是否想要在一個參數(對象Function1)中引用該方法,或者如果您想調用沒有參數的方法(導致Point)。

指定預期類型可以闡明您的打算。

使用getMousePosition()也應該工作。

+1

因此,如果我們決定向類中添加重載方法,我們可以打破人的代碼......這看起來不太好。我認爲在方法之後加上'_'是使它成爲部分應用函數的方法。 –

+1

@Luigi有很多方法通過添加重載來打破人們的代碼,這只是一種方法。 –

+1

http://stackoverflow.com/questions/2510108/why-avoid-method-overloading – retronym

4

更直接的方式來引用所需的重載替代方法是通過包含空參數列表。

peer.getMousePosition()