为什么Scala编译器不允许我写这个?
class TypeCtor[M[_]: ClassManifest]
它抱怨“错误:类型M采用类型参数”。如果我只要求ClassManifest
,编译器应该能够插入它,无论M
的参数化是什么,不是吗?
这可以按预期工作:
class TypeCtor[M[_]](implicit val ev: ClassManifest[M[_]])
(new TypeCtor[Vector]).ev.erasure // => class scala.collection.immutable.Vector
答案 0 :(得分:3)
请参阅我对this question的回答。
答案 1 :(得分:0)
M的参数化是不相关的,但Scala编译器需要ClassManifest的参数才能知道要插入的哪个清单。我们说我们有
class TypeCtor[A,B](implicit val ev: ClassManifest)
现在编译器不知道是否要插入A或B的清单。你也不能写ClassManifest [M],因为ClassManifest需要类型*和M有类型* - > *