2015-06-16 26 views
0

我有一個代碼段,其看起來如下:Scala子類無法識別父類中的通用映射?

abstract class MultipleOutputWriter { 
    protected def writers: collection.mutable.Map[Any, OutputStream] 
    def write(basePath: String, value: Any) 
    def close = writers.values.foreach(_.close) 
} 
class LocalMultipleOutputWriter extends MultipleOutputWriter { 
    protected val writers = collection.mutable.Map[String, FileOutputStream]() 
    def write(key: String, value: Any) = { 
    //some implementation 
    } 
} 

然而在編譯時它會拋出父類和派生類writers之間的類型不匹配。爲什麼會發生? scala編譯器不檢查映射參數是否是子類型?

回答

1

Scala的地圖是在密鑰類型不變,從而Map[String, _]沒有類型關係Map[Any, _]

Map documentation

trait Map[A, +B]

注意,沒有對A沒有方差標記,因此它是不變的。

你可以將其參數化:

abstract class MultipleOutputWriter[K, V <: OutputStream] { 
    protected def writers: collection.mutable.Map[K, V] 
    def write(basePath: String, value: Any) 
    def close = writers.values.foreach(_.close) 
} 
class LocalMultipleOutputWriter extends MultipleOutputWriter[String, FileOutputStream] { 
    protected val writers = collection.mutable.Map[String, FileOutputStream]() 
    def write(key: String, value: Any) = { 
    //some implementation 
    } 
} 
+0

我想我標誌着它過早地糾正。我嘗試了你所說的,它仍然給我以下內容:'類型=> scala.collection.mutable.Map [String,java.io.OutputStream];類的MultipleOutputWriter中的重寫方法編寫器。 值編寫者具有不兼容的類型 protected val writers = collection.mutable.Map [String,FileOutputStream]()' – Sohaib

+0

您可能還需要參數化V。更新 – Daenyth