2010-10-02 52 views
10

Tôi muốn trở về từ một phương thức Java một tham chiếu đến một đối tượng Scala. Làm thế nào tôi có thể làm điều đó?Làm thế nào tôi có thể vượt qua một tham chiếu đối tượng Scala trong Java?

đối tượng Scala của tôi là như thế này:

trait Environment 

object LocalEnvironment extends Environment {...} 
object ServerEnvironment extends Environment {...} 

... và tôi muốn phương pháp Java của tôi là như thế này:

Environment getEnvironment() { return LocalEnvironment; } // DOES NOT COMPILE 

Có cách nào để làm điều này?

+0

Bạn gặp phải lỗi gì? –

Trả lời

20
{ return LocalEnvironment$.MODULE$; } 

sẽ hoạt động.


Chỉnh sửa: lý do tại sao điều này là cách Scala đại diện cho các đối tượng đơn lẻ. Lớp ObjectName$ có một trường trong đó được gọi là MODULE$ được điền bằng một cá thể hợp lệ duy nhất của lớp đó. Nhưng cũng có một lớp được gọi là ObjectName sao chép tất cả các phương thức như là các phương thức tĩnh. Bằng cách đó bạn có thể sử dụng nó như Java (chỉ cần gọi ObjectName.methodName) trong hầu hết các trường hợp, và Scala được để có một lớp học thực sự để vượt qua xung quanh. Tuy nhiên, khi Java cần phải vượt qua lớp học - không phải một cái gì đó thường được thực hiện với một loạt các phương pháp tĩnh, đó là những gì object được thiết kế để mô phỏng trong Java - sau đó bạn phải biết cách Scala đại diện cho nó trong nội bộ.

+1

Một số giải thích sẽ tốt. Đây có phải là một phương pháp 'cầm tay' hay là một hiện vật thực hiện của Scala? –

+0

@Brian - Tôi đã trả lời một phần trong bản chỉnh sửa. Tôi không chắc chắn những gì bạn có nghĩa là 'di động' trái ngược với 'hiện vật thực hiện'. Cả hai đều - Scala sử dụng một lược đồ đặt tên nhất quán cho các hiện vật thực hiện của nó. Không giống như đóng cửa ẩn danh, điều này dễ dự đoán. –

+0

Với 'LocalEnvironment' có vẻ là một đối tượng đơn lẻ độc lập, nó có thể là' trả về LocalEnvironment.MODULE $ '(không có' $ 'trong' LocalEnvironment'). –

22

Trong khi phương thức $ .MODULE $ hoạt động, một cách ít chập chờn hơn để có được tương tác Java với các đối tượng Scala là phơi bày đối tượng dưới dạng phương thức trên chính nó.

Các Scala:

object LocalEnvironment extends Environment{ 
    def instance = this 
} 

Java:

Environment getEnvironment() { return LocalEnvironment.instance(); } 

này hoạt động vì dưới lớp chăn, .instance() được thực hiện như một phương pháp tĩnh trên lớp LocalEnvironment. Đã có một số cuộc thảo luận về các đối tượng Scala nhận được một phương pháp "thể hiện" theo mặc định, chỉ cho mục đích này.

+1

Điều này thật tuyệt, nhưng cần một số bình luận để giải thích mục đích của biến. Vì lý do đó, tôi đã thay thế bằng MODULE $. – David

+0

Đồng ý, mát mẻ và +1, nhưng chỉ hoạt động nếu bạn có quyền ghi vào nguồn của đối tượng. Sẽ không làm việc cho scala.xml.TopScope, ví dụ. – Synesso

Các vấn đề liên quan