У меня есть следующие объявления классов и признаков
class C
class D extends C
trait T extends C
trait U extends D with T
и следующие задания:
val x1:C with T with U = new D with U
val x2:D with T = new C with U
val x3:D with T = new U
val x4:U = new D with T
Первое задание работает, остальные нет. Я хочу понять, почему в обоих случаях.
Насколько я понимаю, линеаризации следующие (->
означает extends
):
C with T with U
:U -> D -> T -> C
D with U
:U -> T -> D -> C
D with T
:T -> D -> C
C with U
:U -> T -> D -> C
Я нарисовал иерархию типов, чтобы лучше понять:
Мое понимание следующее:
x1
: работает, потому что линеаризованные типы одинаковы (порядокD
иT
не важен для типа)x2
: не работает потому что...?x3
: не работает, потому что трейты не могут быть созданы.x4
: не работает, потому чтоD with T
является супертипомU
.
Номер 2, где я застрял. Это должно работать IMO, потому что линеаризация D with T
- это D -> T -> C
, который является супертипом линеаризации C with U
(то есть U -> T -> D -> C
).
Либо мое предположение о том, что порядок смешанных признаков/классов не важен (но тогда почему компилируется первое задание?), либо моя линеаризация неверна, либо ???
Можете ли вы помочь мне в этом?
x2
не имеет значения, произойдет сбой, даже если вы не укажете тип, потому чтоnew C with U
недействителен. - person Tim   schedule 10.09.2018D with T
неверна. Это должно бытьT->D->C
, потому что трейт является подклассом класса, к которому он применяется (чтобы он мог видеть методы этого класса). - person Tim   schedule 11.09.2018