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

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

choTại sao tham chiếu này không rõ ràng?

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 

nhưng thêm loại

val p: Point = peer.getMousePosition 

làm cho nó ok. Tại sao?

chỉnh sửa: gây ra vấn đề:

class A { 
    def value() = 123 
} 

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

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

không gây ra vấn đề:

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

class B extends A {} 

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

Vì vậy, tôi nghĩ câu trả lời có giải thích lý do tại sao nó chỉ xảy ra khi các phương pháp này trong các lớp khác nhau .

Trả lời

9

Có hai phương pháp getMousePosition một không có và một với tham số boolean.

Không có chú giải loại Scala không biết bạn có muốn tham chiếu đến phương thức trong một tham số hay không (hoặc Function1 đối tượng) hoặc nếu bạn muốn gọi một tham số không có tham số (kết quả là Point).

Chỉ định loại dự kiến ​​sẽ làm rõ ý định của bạn.

Sử dụng getMousePosition() cũng sẽ hoạt động.

+1

Vì vậy, chúng tôi có thể ngắt mã của mọi người nếu chúng tôi quyết định thêm phương thức quá tải vào lớp ... điều này dường như không tốt lắm. Tôi nghĩ rằng đặt một '_' sau khi phương pháp là cách để làm cho nó một chức năng được áp dụng một phần. –

+1

@Luigi Có nhiều cách để phá vỡ mã của mọi người bằng cách thêm quá tải, đây chỉ là một cách khác. –

+1

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

4

Một cách trực tiếp hơn để tham chiếu đến phương án thay thế quá tải mong muốn là bao gồm danh sách đối số trống.

peer.getMousePosition() 
Các vấn đề liên quan