2013-07-12 29 views
7

Trong ứng dụng này, tôi nhận được lỗi này:scala.Some không thể được đúc để java.lang.String

scala.Some cannot be cast to java.lang.String 

Khi cố gắng này:

x.email.asInstanceOf[String] 

x.email là một lựa chọn [String]

Chỉnh sửa: Tôi hiểu rằng tôi đang xử lý các loại khác nhau ở đây, tôi đã tự hỏi liệu có cách nào ngắn gọn hơn để không làm gì với Không thì sau đó

match { case....} 

chuỗi. Bởi vì tôi đang truyền x.email vào một String cho các mục đích JSON, một trường rỗng sẽ được xử lý bởi đối tượng JSON và tôi không rõ ràng phải xử lý nó. Xin lỗi vì không rõ ràng !!

+0

Câu trả lời đơn giản là sử dụng phương thức 'foreach'. –

Trả lời

9

Vâng, rõ ràng cho bạn từ các lỗi và các loại mà x.email không phải là một String ...

Thứ nhất, quyết định cách bạn muốn xử lý None (tùy chọn hợp lệ cho loại Option[String]). Sau đó bạn có một số lựa chọn, bao gồm nhưng không giới hạn:

x.email match { 
case None => ... 
case Some(value) => println(value) // value is of type String 
} 

Cách khác, hãy nhìn vào các getgetOrElse phương pháp trên class Option.

Nếu bạn muốn "xuống cấp" tùy chọn để một String với một giá trị có thể null, sau đó sử dụng

x.email.orNull // calls getOrElse(null) 

Cuối cùng, nếu bạn không quan tâm về trường hợp None (và muốn để bỏ qua nó), sau đó chỉ cần sử dụng một đơn giản "cho sự hiểu biết", mà sẽ "bỏ qua" cơ thể trong trường hợp None:

for (value <- x.email) { 
    // value is of type String 
} 
+2

Bạn có thể sử dụng 'orNull' thay vì' getOrElse (null) '. –

+0

Tôi học được điều gì đó mới, ty –

1

Bạn có thể muốn sử dụng kiểu kết hợp:

x.email match { 
    case Some(email) => // do something with email 
    case None => // did not get the email, deal with it 
} 
4

đúc không phải là cách bạn nên nhìn vào đồng nversions khi nói đến Options. Có một cái nhìn tại kỳ họp REPL sau:

C:\>scala -deprecation -unchecked 
Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0). 
Type in expressions to have them evaluated. Type :help for more information. 

scala> val email:Option[String] = Some("[email protected]") 
email: Option[String] = Some([email protected]) 

scala> email.getOrElse("[email protected]") 
res0: String = [email protected] 

scala> 

Bạn cũng có thể muốn xem xét điều này SO câu hỏi: What is the point of the class Option[T]?

và Options API here

Nói chung, đúc/ép buộc là kind- của điều cấm kỵ trong thế giới FP. :)

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