Применение проекции типа к уточненному типу
Рассмотрим следующий пример:
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)