Я с ужасом читаю, что будет со Scala 3, уделяя особое внимание изменениям в составных типах. Они всегда были чем-то вроде хака, поэтому чистые, настоящие типы пересечений, безусловно, являются улучшением. Я не смог найти ничего о том, что происходит с фактической частью уточнения составного типа. В своем текущем проекте я сильно полагаюсь на сильно переплетенные типы, чтобы каждое возвращаемое значение было как можно более узким. Так, например, имея
trait Thing { thisThing =>
type A
type B
type C
def something :Thing {
type A = <related to thisThing.A>
type B <: <related to thisThing.B>
type C = <etc>
}
Это еще возможно? Как достичь этой цели с новой семантикой? Насколько я понимаю, уточнения абстрактных типов почти наверняка будут запрещены, поэтому будет сложно иметь объявление «собственного типа» в корне иерархии типов:
trait Thing {
type ThisThing <: Thing
type A
type B
def copy(...) :ThisThing { type A = ...; type B = ... }
}
На несколько связанной ноте я смотрел на структурные типы. Должен сказать, мне нравится, как мы можем динамически выбирать/реализовывать элементы со статическими объявлениями. Возможно ли это для абстрактных классов? Могу ли я написать что-то вроде:
trait Record(members :(String, Any)*) extends Selectable { ... }
val r = new Record { val name :String; val age :Int }
РЕДАКТИРОВАТЬ: я нашел относительную часть документации, и похоже, что анонимный экземпляр Selectable
освобожден от правила, согласно которому тип анонимного класса является пересечением его расширенных типов - хорошо.
Selectable
, если вы хотите вывести тип уточнения, в противном случае он будет работать почти так же, как в Scala 2. - person user   schedule 27.09.2020