2012-09-10 31 views
7

Tôi đã viết một API trong Scala. Có một vài điểm vào mà tôi đang mong đợi một List [SomeTrait] làm đầu vào và trả về một List [OtherTrait].Gọi mã Scala từ Java với java.util.List khi Danh sách của Scala được mong đợi

Tôi bao gồm Jar đó trong một dự án Java để sử dụng và gặp phải sự cố khi cố gắng chuyển java.util.List sang phương thức mong đợi đối tượng Danh sách của Scala. Tôi nhận ra rằng chúng không giống nhau và Java không biết cách thực hiện chuyển đổi. Vì vậy, làm thế nào để bạn thực hiện công việc này mà không mong đợi người gọi Java để vượt qua trong một danh sách Scala?

Trả lời

7

Tôi rất muốn nghe các đề xuất khác nhưng đây là giải pháp tôi đã tìm thấy và tôi không thể tìm thấy nó ở bất cứ đâu trên Google.

Nếu bình thường Scala entry-quan điểm của tôi là một phương pháp đó là một cái gì đó như thế này:

def doSomething(things: List[Thing]): List[Result] = { ... } 

tôi thêm một phương pháp khác như thế này:

//import scala.collection.JavaConversions._ 
import scala.collection.JavaConverters._ 

def doSomething(things: java.util.List[Thing]): java.util.List[Result] = 
    doSomething(things.asScala.toList).asJava 

Việc chuyển đổi rõ ràng trong các cuộc gọi với bản gốc phương pháp là bởi vì nó sẽ kết thúc trong một vòng lặp vô hạn gọi chính nó.

Đây là lần đầu tiên tôi đăng bài và trả lời câu hỏi của chính mình ... xin lỗi nếu tôi bỏ lỡ một số cách tiêu chuẩn để thực hiện việc này. Dường như nó đáng được chia sẻ và cũng đáng để mở ra để thảo luận về các phương pháp tốt hơn vì tôi rất mới với Scala.

EDIT đang cập nhật để phản ánh đề nghị từ @Luigi Plinge

+0

Đó chính là câu trả lời tôi sắp gửi –

+4

Bạn nên mương 'JavaConversions' và chuyển đổi kết quả trở lại một danh sách Java sử dụng '.asJava' –

+1

+1 theo đề nghị của Luigi, không sử dụng JavaConversions, sử dụng JavaConverters và các phương thức rõ ràng .asJava/.asScala - các chuyển đổi ngầm có thể làm những điều kỳ lạ. Cũng tránh quá tải, tạo một shim/wrapper để được gọi từ Java để thay thế. –

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