此签名声明了更高级别的类型:
case class MyContainer[A, M[_]](el: M[A])
现在,我可以创建它的实例:
scala> val mc1 = MyContainer[Int, Option](Some(3))
mc1: MyContainer[Int,Option] = MyContainer(Some(3))
我也可以将MyContainer
声明为:
case class MyContainer[A, M[A]](el: M[A])
生成与mc1
相同的实例:
mc1: MyContainer[Int,Option] = MyContainer(Some(3))
这些方法之间有什么区别?哪些方法应该使用?
答案 0 :(得分:4)
根据语言规范(§4.4类型参数),这些是等效的:
[M[X], N[X]] [M[_], N[_]] // equivalent to previous clause
本段描述了这种语法背后的原因:
高阶类型参数(类型参数
t
的类型参数)仅在其紧邻的参数子句中可见(可能包括更深嵌套级别的子句)和{{1}的边界}。因此,它们的名称只能与其他可见参数的名称成对地不同。由于高阶类型参数的名称因此通常是不相关的,因此它们可以用t
表示,其中无处可见。
请注意,在这种情况下,_
中的A
会被忽略。它可能是M[A]
,它也会起作用:
T
为了避免混淆,我总是使用scala> case class MyContainer[A, M[T]](el: M[A])
defined class MyContainer
scala> val mc1 = MyContainer[Int, Option](Some(3))
mc1: MyContainer[Int,Option] = MyContainer(Some(3))
,或者至少不重复使用这些名称。