2012-03-22 3 views
18

私の知る限りでは、Javaで私がjava.lang.ObjectをScalaの特定の型にキャストする方法は?

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

しかし、どのようScalaでそれを書き換えることができますか?

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

A Javaライブラリは、私は(もこのライブラリで定義された)より具体的な型にキャストする必要が戻っjava.lang.Objectを使用します。 Javaの例は、私の最初の例のように正確な方法ありませんが、ちょうどその代わり、Javaの(TargetType)sourceのScalaのsource: TargetTypeを使用することはできません。

答えて

25

あなたは絶対にJavaライブラリとの -forの互換性を持っている場合は、次のように使用することができます - あなたは、たとえば:一般的に

val s: String = o.asInstanceOf[String] 

を、しかし、asInstanceOfはコードのにおいで、避けるべきです。

+0

取り組んでいるようです。そして、はい、私は絶対に必要です - Javaライブラリとの互換性のために。ありがとう。 – Ivan

10

ここでそれを行うための安全な方法です。この問題を持つ未来の人々のために

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

場合によっては、これはおそらく過度のものだと感じられ、asInstanceOfはうまくいきます。プリジェネリックのJavaコレクションなどを使用するライブラリがついているときに、 'readObject'を使用して逆シリアル化します。私はこれがこれらのケースの1つであると仮定していました。 –

5

Traviさん:あなたは結果を返す必要がある場合、これは同様に動作

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

以前の答えは正確であり、例えばYamlbeansでDesearializedオブジェクトをマップにマップするために次のような方法で使用できます。

val s: java.util.Map[String,String] = obj.asInstanceOf[java.util.Map[String,String]] 

私はこの小さなコメントが、私がここで見つけた答えの詳細として、将来的には役に立つと思います。

関連する問題