2016-04-01 15 views
2

java.utils.Properties için örtülü olmak üzere Map olmasını istiyorum.Scala örtülü dönüştürme, hedefe yönelik olmayan hedef üzerinde gerçekleştirilmiyor

implicit def map2Properties(map: Map[String, String]): Properties = 
    map.foldLeft(new java.util.Properties) { case (p, (k, v)) => p.put(k, v); p } 

val properties :Properties = Option(Map[String,String]("k"->"v")).getOrElse(Map[String, String]()) 

Error:(7, 82) type mismatch; 
found : Object 
required: java.util.Properties   

ben Map[String,String]() ilk dönüştürülen var, bu yüzden karşılığında Object tip var.

Neden her iki haritayı da Option ve orElse birlikte dönüştürmek veya ifadeyi tempolu olarak sonuna dönüştürmek için değil? İade Şartlarını uygun şekilde almak için nasıl yapabilirim?

cevap

0

Garip bir şey, getOrElse'nin dolaylı dönüşümü ve dönüş türü ile devam ediyor. Ancak bu çalışır:

Option(Map[String,String](("k","v"))).fold(Map[String,String]())(identity) 

ve yapar bu

Option(Map[String,String](("k","v"))).getOrElse[Map[String,String]](Map()) 
3

Ben scala derleyici sizin Map için dönüşüm bulamıyorum neden tam emin değilim.

def getOrElse[B >: A](default: => B): B 

sonuç mutlaka o da Map[Any, Any] gibi bir süper tip olabilir çünkü orijinal seçeneğiyle aynı türde değil: Ama (belki) silinmeye ve Option.getOrElse imza ile ilgili bir şey vardır sanıyorum.

val properties2: Properties = Option(Map[String,String](("k","v"))).getOrElse(Map.empty[String, String]): Map[String, String] 

seçenek Özellikler içermelidir derleyici anlatmak için bir ara adım kullanın:

açıkça getOrElse sonucu tipi derleyici söyle:

bu sınırlamasını aşmak için nasıl çeşitli seçenekler vardır :

val propOpt: Option[Properties] = Option(Map[String,String](("k","v"))) 
val properties3: Properties = propOpt.getOrElse(Map.empty[String, String]) 

// or 
val properties4: Properties = (Option(Map[String,String](("k","v"))): Option[Properties]).getOrElse(Map.empty[String, String]) 

// OR, shortest so far: 
val properties5: Properties = Option(Map[String,String](("k","v")): Properties).getOrElse(Map.empty[String, String]) 
İlgili konular