2012-03-09 30 views
8

Tôi muốn chuyển đổi một bản đồ scala có giá trị Boolean thành một bản đồ java với một giá trị java.lang.Boolean (cho khả năng tương tác).Chuyển đổi bản đồ Scala chứa bản đồ Boolean sang Java chứa java.lang.Boolean

import scala.collection.JavaConversions._ 

val a = Map[Int, Boolean]((1, true), (2, false)) 
val b : java.util.Map[Int, java.lang.Boolean] = a 

không thành công với:

error: type mismatch; 
found : scala.collection.immutable.Map[Int,scala.Boolean] 
required: java.util.Map[Int,java.lang.Boolean] 
val b : java.util.Map[Int, java.lang.Boolean] = a 

Các JavaConversions chuyển đổi ngầm làm việc vui vẻ với container tham số về các loại tương tự, nhưng không biết về việc chuyển đổi giữa Boolean & java.lang.Boolean.

Tôi có thể sử dụng phép thuật JavaConversions để thực hiện chuyển đổi này hay không, có cú pháp ngắn gọn để thực hiện chuyển đổi mà không sử dụng chuyển đổi tiềm ẩn trong gói đó không?

Trả lời

8

Trong khi JavaConversions sẽ chuyển bản đồ Scala thành java.util.Map và Scala impl icitly chuyển đổi scala.Boolean thành java.lang.Boolean, Scala sẽ không thực hiện hai chuyển đổi tiềm ẩn để nhận được loại bạn muốn.

Boolean cung cấp phương thức box để chuyển đổi rõ ràng.

val b: java.util.Map[Int, java.lang.Boolean] = a.mapValues(Boolean.box) 

Nếu bạn thường xuyên thực hiện điều này trong mã, bạn có thể xác định chuyển đổi ẩn của riêng bạn cho tất cả Map[T, Boolean].

import scala.collection.JavaConversions._ 

implicit def boolMap2Java[T](m: Map[T, Boolean]): 
    java.util.Map[T, java.lang.Boolean] = m.mapValues(Boolean.box) 

val b: java.util.Map[Int, java.lang.Boolean] = a 
+0

Cảm ơn. Liệu Scala có bao giờ chuỗi hai chuyển đổi tiềm ẩn? – flend

+1

Theo [Lập trình trong Scala] (http://amzn.com/0981531644), không. "Quy tắc một lần tại một thời điểm: Chỉ có một lần thử nghiệm tiềm ẩn". – leedm777

8

scala.collection.JavaConversions sẽ không giúp bạn với vấn đề scala.Boolean đến java.lang.Boolean. Sau đây sẽ làm việc, tuy nhiên, bằng cách sử dụng phương pháp boolean2Boolean từ scala.Predef:

val a = Map[Int, Boolean](1 -> true, 2 -> false) 
val b: java.util.Map[Int, java.lang.Boolean] = a.mapValues(boolean2Boolean) 

Hoặc bạn có thể sử dụng Boolean(boolean value) constructor của Java:

val a = Map[Int, Boolean](1 -> true, 2 -> false) 
val b: java.util.Map[Int, java.lang.Boolean] = 
     a.mapValues(new java.lang.Boolean(_)) 

Hoặc bạn chỉ có thể tuyên bố bản đồ đầu tiên sử dụng các loại tài liệu tham khảo Java :

val a = Map[Int, java.lang.Boolean](1 -> true, 2 -> false) 
val b: java.util.Map[Int, java.lang.Boolean] = a 
+0

Bạn đang thiếu 'asJava' trong cả hai trường hợp để chuyển đổi Bản đồ. –

+1

@Joachim: Bạn chỉ cần 'asJava' nếu bạn đang sử dụng' JavaConverters'. Câu hỏi và câu trả lời của tôi sử dụng đối tượng 'JavaConversions', thực hiện chuyển đổi một cách ngầm định. –

+0

Ah, không biết về JavaConversions, cảm ơn. Bạn gõ vào bình luận của bạn ngay trên này nhưng tìm thấy tên trong câu trả lời. –

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