2013-08-17 1 views
0

Как известно, Nil в 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` 
     } 
    } 
} 

И мой вопрос, как я могу вернуться Nil в методе -?

+0

Является '-' возвращение разницы между базовой картой? Почему ты возвращаешь «Нил»? Может быть, вы должны вернуть пустую карту? – tkroman

+1

Поскольку '-', кажется, возвращает _a новую коллекцию_, общий вопрос заключается в том, почему вы хотите использовать изменчивую коллекцию в первую очередь? Неизменяемые коллекции более эффективны для возврата измененных копий, потому что они необходимы для этого и используют структурный обмен для оптимизации этих операций. –

ответ

4

Nil - это неизменный (пустой) неизменный список, а не общий пустой маркер для типов коллекций. Похоже, вы просто хотите new ResourceMap или (если вы хотите очистить текущую карту, а затем вернуть ее, а не просто вернуть новый пустой экземпляр):

+0

Я бы рекомендовал вернуть (или установить базовую карту) Map.empty – tkroman

+1

@cdshines mutable.HashMap.empty возвращает HashMap, который не является ResourceMap (суперкласс не является подклассом). Однако вы можете переопределить метод 'empty' для возврата' new ResourceMap', а затем вызвать его в методе '-'. – Shadowlands

+0

Да, похоже, нам нужно написать 'new ResourceMap.empty', поэтому никаких сокращений. Во всяком случае, иногда это может казаться более ясным :) – tkroman

0

Вы можете определить пустой объект, унаследованный от вашего класса, и использовать это когда вы хотите использовать пустой HashMap

, например:

private object EmptyHashMap extends ResourceMap { } 

class ResourceMap extends HashMap[String, Int] { 

    def -(o: Something):ResourceMap = { 
     if(....){ 
     something 
     }else{ 
      EmptyHashMap 
     } 
    } 
} 
Смежные вопросы