Влияет ли линеаризация в scala на способ привязки внутренних типов? - PullRequest
0 голосов
/ 13 февраля 2020
trait Root { type T <: Root }
trait A extends Root { type T <: A }
trait B extends Root { type T <: B }
trait C extends A with B

Приведенный выше код не компилируется, поскольку привязка типа T в C относится к типу T <: B, который явно не вписывается в тип привязки T <: A для T в типе A. Почему тип T C связан с типом T <: B, а не с типом T <: A? Это из-за линеаризации? </p>

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

По принципу Лискова. C, являющийся подтипом A, B и Root, должен удовлетворять всем этим контрактам.
Таким образом, он должен иметь внутренний тип T, который должен быть подтипом A , B и Root.

Таким образом, он не ограничен T <: B или не может быть ограничен T <: A, он должен быть ограничен обоими.
По некоторым причинам, компилятор не может определить правильный тип для T или, возможно, он просто решает, что в этом случае лучше, чтобы пользователь был явным, а не выводил.

0 голосов
/ 13 февраля 2020

A и B - это разные ветви от Root. Они несовместимы, как указывает компилятор.

Если у вас есть C, который наследует и A, и B, и вы ожидаете, что тип T будет подтипом как A, так и B, тогда вы должны иметь тип T к подтипу C:

trait C extends A with B { type T <: C }

Компилируется просто отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...