2014-01-07 4 views
1

При портировании моего project от Scala 2.10 до 2.11 у меня возникла внезапная ошибка компиляции с параметризацией типа. Я попытался изменить и точно определить; все еще что-то странное пошло не так. Может ли кто-нибудь объяснить? BTW Я был доволен этой регрессией (или прогрессией), так как это побудило меня упростить код.this.type некорректно скомпилирован?

trait TNode {type N <: Node {type T = this.type}} 
trait Node {type T <: TNode {type N = this.type}; def t: T} 

trait TNodeCode[R] extends TNode {type N <: NodeCode[R]; val code:()=>N=>R} 
trait NodeCode[R] extends Node {type T <: TNodeCode[R]} 

object Test { 
    def executeCode[R](n: Node, code: =>()=>R): R = {null.asInstanceOf[R]} 

    def executeTCode[N <: NodeCode[R], R](n: N): R = { 
    executeCode(n,()=>n.t.code.apply.apply(n)) 
    // compile error:      ^
    // type mismatch; found: n.type (with underlying type N) required: _1.N where val _1: n.T 
    } 
} 
+0

Мне нравится выравнивание столбцов! Но вы выбросили пробелы вокруг некоторых знаков препинания. –

+0

Вам не нужно класть '()' после первого 'apply' в строке, начинающейся с' executeCode (n, ... '? –

+0

Спасибо, я немного улучшил интервал. Первый« apply »работает с и без пустого списка параметров '()'. –

ответ

1

У меня есть поспешный частичный ответ:

Когда вы измените границу T в NodeCode, вы теряете информацию о том, что предыдущая оценке было измельчение с N привязан к this.type.

Последняя победа.

This is the question Я думал.

Это не может удовлетворить ваши потребности:

trait TNode0 {type N <: Node0 } 
trait Node0 {type T <: TNode0 ; def t: T} 

trait TNode extends TNode0 {type N <: Node {type T = this.type}} 
trait Node extends Node0 {type T <: TNode {type N = this.type}} 

trait TNodeCode[R] extends TNode0 {type N <: NodeCode[R] {type T = this.type}; val code:()=>N=>R} 
trait NodeCode[R] extends Node0 {type T <: TNodeCode[R] {type N = this.type}} 

Edit: что, кажется, не поможет, извините. Что-то еще происходит.