2013-04-29 2 views
2

Я хочу сделать что-то вродепростирающиеся коллекции Scala для конкретного типа элемента

class Pack extends collection.immutable.List[Dog]{ 
    def pullSled() = //... 
} 

Но компилятор Scala говорит мне

illegal inheritance from sealed class List 

Это было бы тривиально сделать в Java, но я думаю, это что-то ключевое, что мне не хватает.

Мотивы:

Я хочу, чтобы иметь возможность использовать все методы базового класса

(new Pack()).contains(snoopy) 

Я хочу, чтобы иметь возможность продлить его, либо непосредственно, либо с Mixins

new Pack() with Driver 

Я бы хотел (а) просто изменить базовый тип коллекции (например, для переключения на набор)

Спасибо!

ответ

5

List[T] является окончательным, поэтому вы не можете продлить его (см. Почему ниже). Если вам просто нужен дополнительный метод на List[Dog], проще всего, вероятно, сутенер его:

implicit class Pack(l: List[Dog]) { 
    def pullSled() = //... 
} 

Если Pack находится в области видимости, следующие будут работать:

val a = List(new Dog) 
a.pullSled() 

Если вам действительно нужно создать собственная коллекция собак, посмотрите здесь: http://www.scala-lang.org/docu/files/collections-api/collections-impl.html

вы не можете продлить от List[T] из-за следующего: Предположим, у вас есть Pack как Вы хотели бы иметь его, теперь следующий будет работать, но на самом деле не дают вам то, что вы хотите:

val pack: Pack = ... 

val pack2 = new Dog :: pack 

// pack2: List[Dog], not a Pack... :(

Правильно простирающийся от LinearSeq, как описано в верхней ссылке смягчит это.

+0

Хороший ответ! Часть моей мотивации для этого - читаемость. Я все еще хочу использовать все полезные методы коллекции, но все равно могу обходить простые непаритируемые объекты. В реальной жизни я хочу сделать это для гораздо более громоздких классов, чем собак. Еще раз спасибо! – user833970

+0

@ user833970 Рад, что это помогает. Кстати, простой псевдоним типа может быть и опцией. – gzm0

+0

Проблема с ailiasing заключается в том, что я по-прежнему не могу расширить свой специализированный класс позже. – user833970