При портировании моего 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
}
}
Мне нравится выравнивание столбцов! Но вы выбросили пробелы вокруг некоторых знаков препинания. –
Вам не нужно класть '()' после первого 'apply' в строке, начинающейся с' executeCode (n, ... '? –
Спасибо, я немного улучшил интервал. Первый« apply »работает с и без пустого списка параметров '()'. –