Применение проекции типа к уточненному типу

Рассмотрим следующий пример:

      trait T3

trait T2{
  type TT4
  type TT3 <: T3
}

trait T1{
  type TT2 <: T2
}

теперь я хочу написать функцию, грубо говоря, выглядит как

      def test[T <: T1](t: T#TT2{type TT4 = Int}#TT3) = println(t)  //invalid syntax

который, к сожалению, не является допустимым синтаксисом. Вполне возможно написать такую ​​функцию

      def test[T <: T1](t: T#TT2#TT3) = println(t)

Но я хотел бы добавить немного более строгое ограничение на T#TT2делая его изысканным типом T#TT2{ type TT4 = Int}.

Есть ли обходной путь?

1 ответ

Попробуйте тип упаковки T#TT2 { type TT4 = Int }в скобках перед финальной проекцией вот так

      def test[T <: T1](t: (T#TT2 { type TT4 = Int })#TT3) = ???

Типы всегда можно заключать в круглые скобки

      SimpleType        ::=  SimpleType TypeArgs
                      |  SimpleType ‘#’ id
                      |  StableId
                      |  Path ‘.’ ‘type’
                      |  Literal
                      |  ‘(’ Types ‘)’      <======= note the parentheses

Например

      scala> val xs: (List[(Int)]) = List(42)
val xs: List[Int] = List(42)
Другие вопросы по тегам