2012-03-22 3 views
18

지금까지 내가 아는 한, 자바에서 나는java.lang.Object를 스칼라의 특정 유형으로 캐스트하는 방법은 무엇입니까?

Object o = new String("abc") 
String s = (String) o 

하지만 어떻게 스칼라에서 그것을 다시 할 수 있습니까?

val o: java.lang.Object = new java.lang.String("abc") 
val s: String = // ?? 

자바 라이브러리는 내가 (이 라이브러리에 정의)보다 구체적인 형식으로 캐스팅 할 필요가 반환 java.lang.Object를 사용하고 싶습니다. 자바 예제는 제 첫 번째 예제와 똑같지 만, 자바의 (TargetType)source 대신 스칼라의 source: TargetType을 사용하는 것은 효과가 없습니다. 당신 절대적으로 자바 라이브러리와 -for 호환성이있는 경우

답변

25

가에 대한 예 - 다음 사용할 수 있습니다 일반적으로

val s: String = o.asInstanceOf[String] 

을하지만, asInstanceOf는 코드 냄새 피해야한다.

val o: java.lang.Object = new java.lang.String("abc") 
o match { case s: String => /* do stuff with s */ } 

당신이 결과를 반환해야 할 경우,이뿐만 아니라 작동합니다 :

import PartialFunction._ 
def onlyString(v: Any): Option[String] = condOpt(v) { case x: String => x } 
val s: Option[String] /* it might not be a String! */ = onlyString(o) 
+0

작동합니다. 그리고 네, 자바 라이브러리와의 호환성을 위해 절대적으로 필요합니다. 감사. – Ivan

10

여기에 그것을하는 안전한 방법입니다 이전 답변은 정확하고 예를 들어 Yamlbeans에서 Desearialized 객체를지도에 매핑하는 데 사용할 수 있습니다.

나는이 작은 코멘트가 내가 여기에서 찾은 대답에 대한 세부 사항으로서 장래에 하나에 도움이되기를 바랍니다.

+0

어떤 경우에는 이것이 지나친 것 같고 'asInstanceOf'는 괜찮습니다. pre-generics Java 콜렉션을 사용하는 라이브러리가 붙어있을 때'readObject'를 사용하여 deserialize 할 수 있습니다. 이러한 경우 중 하나라고 생각했습니다. –

5

이 문제 Travi의를 가진 미래의 사람들을 위해서

관련 문제