2015-02-19 3 views
2

У меня возникли проблемы с рекурсивным самостоятельным типом, которое должно соответствовать члену типа:элемента типа Использования в качестве самостоятельного типа

trait Elem { me => 
    type Peer 

    import me.{Peer => Peer0} 

    type This <: Elem { type Peer = Peer0 } 

    def mkCopy(): This 
} 

Теперь я хочу, чтобы определить удобную черту:

trait ImmutableImpl extends Elem { 
    _ : This => 

    def mkCopy(): This = this 
} 

Это не работает, потому что "ошибка: не найден: Данный тип" :(

Следующая попытка:

trait ImmutableImpl[Repr] extends Elem { 
    _ : Repr => 

    type This = Repr 

    def mkCopy(): This = this 
} 

Это не с «Ошибка: переопределяющий тип Это ... Это несовместимый тип».

я могу сделать только эту мерзость:

trait ImmutableImpl[Peer0, Repr <: Elem { type Peer = Peer0 }] extends Elem { 
    _ : Repr => 

    type Peer = Peer0 
    type This = Repr 

    override def mkCopy(): This = this 
} 

class IntElem extends ImmutableImpl[Int, IntElem] 

В реальном случае у меня есть несколько элементов типа, так что делает этот последний подход бесполезен, так как это намного больше котла пластины, что осуществлению mkCopy вручную каждый раз, когда ,

Любые идеи?

ответ

1

Мой обходной путь, чтобы расслабить уточнение на This, как представляется, не требуется в моем API в конце:

trait Elem { me => 
    type Peer 

    // import me.{Peer => Peer0} 

    type This <: Elem // { type Peer = Peer0 } 

    def mkCopy(): This 
} 

trait ImmutableImpl[Repr <: Elem] extends Elem { 
    _ : Repr => 

    override type This = Repr 

    def mkCopy(): This = this 
} 

class IntElem extends ImmutableImpl[IntElem] { 
    type Peer = Int 
} 
1

Кажется, что параметр типа лучше подходит для этого.

trait Elem[A] { me: A => 
    def mkCopy(): A = this 
} 

scala> class Z extends Elem[Z] 

scala> (new Z).mkCopy() 
res0: Z = [email protected] 

Я думаю, что проблема в том, что элемент типа не в рамках декларации самостоятельного типа, и как вы работали вокруг, что было с помощью структурного типа, связанного с другим признаком. Но почему бы не вырезать посредника и просто использовать параметр типа на Elem с самонаведением, требующим, чтобы он был того же типа, что и параметр.

+0

Проблема, она станет 'Элем [S <: Sys [S ], A [~ <: Sys [~]] <: Elem [~, A]] 'в конце, и я должен носить этот багаж во многих местах; на самом деле это оригинальная мотивация для членов типа. Я освобождаю ограничение на очистку 'Elem {...}' теперь, таким образом, я могу иметь тип переопределения This = Repr' в признаке реализации, кажется, и я, кажется, не полагаюсь на этой общей утонченности. –

Смежные вопросы