Совместимость назначения смешанных черт Scala (иерархия) - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть следующие объявления классов и признаков

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

Я нарисовал иерархию типов, чтобы лучше понять:

type hierarchy

Я понимаю следующее:

  • 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).

Либо мое предположение, что порядок смешанных черт / классов не важен (но тогда почему компилируется первое задание?), Либо моя линеаризация неверна, или ???

Можете ли вы помочь мне в этом?

1 Ответ

0 голосов
/ 10 сентября 2018

Проблема в том, что new C with U недействительно; тип val x2 не имеет значения.

Черта U расширяет D, что означает , ее можно применять только к подклассам D. Поскольку C не является подклассом D, черта не может быть применена к нему.

Черта, которая расширяет класс, похожа на тип личности, но с некоторыми тонкими различиями. См. Этот ответ для получения дополнительной информации.

...