2012-03-22 14 views
18

olarak bildiğim kadarıyla, Java benScala'da belirli bir türe java.lang.Object nasıl kullanılır?

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

Ama nasıl Scala bunu yeniden yazmak olabilir?

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

bir Java kütüphanesi ben (ayrıca bu kütüphanede tanımlı) daha belirgin bir tür atama için gereken döner java.lang.Object kullanmak istiyorum. Bir Java örneği tam olarak benim ilk örneğim gibi, ancak Java'nın (TargetType)source yerine sadece Scala'nın source: TargetType kullanılması çalışmıyor. Eğer kesinlikle bir Java kütüphanesi ile -için uyumluluk varsa

cevap

25

, örneğin-aşağıdakileri kullanabilirsiniz: Genel olarak

val s: String = o.asInstanceOf[String] 

olsa da, asInstanceOf bir kod koku ve kaçınılmalıdır.

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

Eğer sonuç döndürmek için gerekiyorsa, bu da iyi çalışır:

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

Çalışıyor gibi görünüyor. Ve evet, kesinlikle buna ihtiyacım var - bir Java kütüphanesi ile uyumluluk için. Teşekkürler. – Ivan

10

İşte bunu yapmanın güvenli bir yoldur önceki cevap doğrudur ve örneğin Yamlbeans'de Haritalar'a, dengesizleştirilmiş nesneleri aşağıdaki gibi bir şeyle eşlemek için kullanılabilir:

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

Umarız bu küçük yorum, gelecekte bulduğum cevap üzerinde bir detay olarak geleceğe yararlı geliyor.

+0

Bazı durumlarda bunun büyük olasılıkla çok fazla olduğunu düşünüyorum ve “asInstanceOf” sadece iyi - örn. pre-generics Java koleksiyonlarını kullanan kütüphanelerle takılı kaldığınızda 'readObject' ile serileştirme. Bu durumlardan birinin olduğunu varsayıyordum. –

5

Bu sorunu, Travi en olmayan gelecek halkının iyiliği için

İlgili konular