này không hoạt động như mong đợi (kể từ khi tôi đang cố gắng để gọi một gói tin run
từ bên ngoài Services
):Scala: Truy cập gói phương pháp có thể nhìn thấy thông qua các loại cấu trúc bên ngoài gói
object Services {
class HelloPrinter {
private[Services] def run = "Hello"
}
}
val obj = new Services.HelloPrinter
Nhưng, đáng ngạc nhiên làm việc này:
val obj: {def run: String} = new Services.HelloPrinter
obj.run
Tôi sẽ nói, lỗi của trình biên dịch vì HelloPrinter không khớp với loại cấu trúc vì quy tắc hiển thị gói, không nên biên dịch!
Đây là một trường hợp chương trình biên dịch nhưng nó ném một ngoại lệ thời gian chạy (java.lang.NoSuchMethodException
):
class HelloPrinter {
private[HelloPrinter] def run = "Hello"
}
val obj: {def run: String} = new HelloPrinter
obj.run
Đây có phải là một tính năng ngôn ngữ hoặc loại trừ tôi đang thiếu hoặc hợp pháp một lỗi trong Scala?
Rất thú vị. Bạn đã thử chạy với REPL 'scala -feature'? Nó cho thấy rõ ràng rằng có một cuộc gọi phản xạ được gọi. Tôi đoán phạm vi và bất biến là tất cả ra khỏi cửa sổ khi nói đến sự phản ánh. – marios
Cũng như xa như tôi có thể nói cảnh báo là nhiều hơn dự định để làm cho bạn thận trọng về những hậu quả có thể thực hiện. Sự hiểu biết của tôi là mặc dù sử dụng sự phản chiếu để thực hiện cuộc gọi thực tại thời gian chạy, việc gõ cấu trúc (được cho là) được đánh máy tĩnh như bất kỳ thứ gì khác trong scala, vì trình biên dịch sẽ kiểm tra xem chữ ký có khớp đúng không. thành công). Trừ khi tất nhiên bạn thực hiện một downcast rõ ràng cho một loại cấu trúc. Tuy nhiên ở đây không có diễn viên, trình biên dịch đơn giản dường như bỏ qua việc kiểm tra khả năng hiển thị của phương thức. –
Ví dụ thứ hai mà bạn nói ném một 'NoSuchMethodException' không biên dịch cho tôi (trong 2.10.4 và 2.11.6 REPL). –