将类型投影应用于精炼类型
Apply type projection to a refined type
考虑以下示例:
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}
。
有什么解决办法吗?
尝试在最终投影之前将类型 T#TT2 { type TT4 = Int }
包裹在括号中
def test[T <: T1](t: (T#TT2 { type TT4 = Int })#TT3) = ???
Types总是可以用括号括起来
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)
考虑以下示例:
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}
。
有什么解决办法吗?
尝试在最终投影之前将类型 T#TT2 { type TT4 = Int }
包裹在括号中
def test[T <: T1](t: (T#TT2 { type TT4 = Int })#TT3) = ???
Types总是可以用括号括起来
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)