2016-01-30 3 views
3

Вопрос: Как я мог добиться следующего шаблона в scala или Java?Scala: класс [T] расширяет T?

trait A 
case class B[Base](...) extends A with Base 

это разрешено в C++:

template <class Base> 
class B : public Base, public A 

Вот почему я хочу сделать это:

У меня есть два абстрактных синтаксических деревьев: ComplexForm и SimpleForm

и у меня есть тип для списков: case class L[T](list : List[T]) extends Complex Form with T

теперь L[SimpleForm] должен extends SimpleForm with ComplexForm но L[ComplexForm] должен только extend ComplexForm

мне нужно, чтобы иметь возможность шаблон матча Agains все L[T] сразу, чтобы избежать дублирования.

+1

@cchantep, я, очевидно, пытался: 'случай класса O [T] (список: Список [T]) продолжается T' и ошибка «(1) T не имеет конструктора; (2) требуется тип класса, но T found« –

+0

generics работает не так, как C++-шаблоны, см. Http://stackoverflow.com/questions/18347167/does-scala-provide-anything- as-c-templates – 4e6

+1

Мне не совсем ясно, чего вы пытаетесь достичь, смешивая в произвольном 'T'. Почему оболочка 'L [T]' также должна быть 'T'? –

ответ

1

Что-то вроде этого, возможно?

trait Form 
trait SimpleForm extends Form 
trait ComplexForm extends Form 
trait ListForm[+T <: Form] extends ComplexForm { 
    def l: List[T] 
} 


case class SimpleList(val l: List[SimpleForm]) extends SimpleForm with ListForm[SimpleForm] 
case class ComplexList(val l: List[ComplexForm]) extends ListForm[ComplexForm] 

Вы можете матч шаблон и как это:

// ... 
case x:ListForm[Form] => doStuff(x.l) 
Смежные вопросы