2013-08-17 21 views
0

如您所知,Scala中的Nil是不可變集合的對象。我有一個問題,我的自定義可變集合,例如可變的Scala集合中的無對象

class ResourceMap extends mutable.HashMap[String, Int] { 
    .... 
    def -(o: ResourceMapType):ResourceMap = { 

     if (....) { 
      ...... 
     } else { 
      Nil // Exception : raises the `change return type to Nil.type` 
     } 
    } 
} 

我的問題是我怎麼能在-方法返回零?

+0

是'-'返回底層地圖之間的差異?那你爲什麼要返回'無'呢?也許你應該返回空地圖? – tkroman

+1

因爲'-'似乎正在返回一個新collection_,所以總體問題是爲什麼你想首先使用可變集合?不可變集合對於返回修改後的副本更有效,因爲他們需要這樣做並使用結構化共享來優化這些操作。 –

回答

4

Nil是零長度(空)的不可變列表,而不是集合類型的一般空標記。看起來你只是想new ResourceMap,或者(如果你想清除當前的地圖,然後返回它,而不是隻返回一個新的空實例):clear; this

+0

我建議返回(或設置底層地圖)Map.empty – tkroman

+1

@cdshines mutable.HashMap.empty返回一個HashMap,它不是一個ResourceMap(超類不是子類)。但是,你可能會做的是覆蓋'empty'方法來返回'新的ResourceMap',然後在'-'方法中調用它。 – Shadowlands

+0

是的,看起來我們需要寫'新的ResourceMap.empty',所以沒有簡寫。無論如何,有時它可能看起來更清楚:) – tkroman

0

您可以定義從你的類和使用繼承了一個空對象當你想使用空HashMap

例如:

private object EmptyHashMap extends ResourceMap { } 

class ResourceMap extends HashMap[String, Int] { 

    def -(o: Something):ResourceMap = { 
     if(....){ 
     something 
     }else{ 
      EmptyHashMap 
     } 
    } 
}