2011-09-21 31 views
5
import swing._ 

object PeerTest extends SimpleSwingApplication { 
    def top = new MainFrame { 
    val p = peer.getMousePosition 
    } 
} 

Bu başvuru neden belirsiz?

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 

verir ama tip

val p: Point = peer.getMousePosition 

ekleyerek Tamam yapar. Niye ya?

düzenleme: neden sorun:

class A { 
    def value() = 123 
} 

class B extends A { 
    def value(b: Boolean) = 42 
} 

object Main extends App { 
    println ((new B).value) 
} 

neden olmaz sorun: Yani

class A { 
    def value() = 123 
    def value(b: Boolean) = 42 
} 

class B extends A {} 

object Main extends App { 
    println ((new B).value) 
} 

Cevabın yöntemleri farklı sınıflara olduğunda yalnızca oluşur niçin olduğunu düşünüyorum .

cevap

9

iki yöntem olmadan getMousePosition bir ve bir Boole parametresi ile bir vardır.

Bir tür ek açıklama olmadan Scala, tek bir parametrede (bir Function1 nesnesi) yönteme bir başvuru isteyip istemediğinizi veya parametresi olmadan bir parametreyi çağırmak istediğinizi (Point sonuçlanır) bilmez.

beklenen türünü belirtme senin niyetinde açıklık getirmektedir.

getMousePosition() kullanılması yanı çalışmalıdır.

+1

Bir sınıfa aşırı yükleme yöntemleri eklemeye karar verirsek, insanların kodunu kırabiliriz ... Bu çok iyi görünmüyor. Yöntemi kısmen uygulanmış bir işlev haline getirmenin yolu bir '' 'koymayı düşündüm. –

+1

@Luigi Aşırı yük ekleyerek insanların kodunu kırmanın birçok yolu var, bu sadece bir yol. –

+1

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

4

istenen aşırı alternatif başvurmak için daha doğrudan bir yol boş bağımsız değişken listesi de dahil olmak üzere gereğidir.

peer.getMousePosition() 
İlgili konular