从这个问题:Sample of `forSome { val `?
我了解到,如果我使用这种存在类型的格式:
type SomeList = List[v.T] forSome { val v : { type T }; }
代码中必须有一个名为T
的类型。
但是这段代码:
List[T] forSome { type T }
虽然也有{ type T }
,但它不需要存在名为T
的类型,相反,它可以匹配任何类型。
我无法理解为什么会有这样的差异,我能指望两种{ type T }
部分具有完全相同的含义吗?
答案 0 :(得分:0)
好的,我会尝试一下(虽然存在类型对我来说也很新......)
您的第一个示例使用路径依赖类型v.T
,并且表示给定包含名为T的类型的值v,构造其元素具有类型(v.T
)的List类型&#34 ;.
你的第二个例子
List[T] forSome { type T }
表示"类型为T的列表,其中T可以是任何类型",并且相当于:
List[_]
(编译器实际上在Eclipse中将类型赋予List[_]
.David R. MacIver' s article更详细地讨论了这一点。)
除非你为T
类型添加额外的界限,否则它可能不是很有用在第一个例子中,我们指的是一个非常具体的命名(路径依赖)类型;在answer to your linked question中,T
必须存在并绑定到具体类型,因为我们使用它来访问该类型的值:
object X {
type T = String
val x: T = "hello"
}
在第二个例子中,我们指的是任何类型。
我认为相同语法的不同含义是由于不同的上下文(路径依赖类型或普通类型)。
另见: