为什么获得具有更高kinded类型的Trait的清单不起作用?

时间:2014-09-24 07:16:23

标签: scala

任何人都可以解释一下,为什么以下代码不起作用,我该怎么做才能使它工作?

Scala版本是2.10.4

scala> trait A[T[_]]
defined trait A

scala> trait B[T]
defined trait B

scala> manifest[A[B]]
<console>:10: error: erroneous or inaccessible type
manifest[A[B]]

1 个答案:

答案 0 :(得分:2)

Manifest有很多限制,因此已弃用TypeTag

import scala.reflect.runtime.universe.TypeTag
trait A[T[_]]
trait B[T]
typeTag[A[B]] // reflect.runtime.universe.TypeTag[A[B]] = TypeTag[A[B]]

也就是说,如果你仍想使用Manifest,你必须使用它较弱的堂兄ClassManifest,因为它可以代表更高阶的种类,因为它不需要指定完整的类型信息。

所以你应该能够做到

classManifest[A[B]]

正确?嗯,不太好。这是你在Scala 2.11.2中得到的错误

  

类型参数(B)的种类不符合预期种类的参数(类型T)。 B&#39的类型参数与T类预期参数不匹配:   特征B有一个类型参数,但类型T没有

由于B似乎没有正确的#34;形状&#34;编译器会出现混乱。嗯,scalac,相信我,它确实有正确的形状。让我们用勺子喂你......

classManifest[A[({type l[T] = B[T]})#l]]
// ClassManifest[A[[T]B[T]]] = A[<?>]

这种scalac在不同的高级种类之间的类型推断,在其所有的辉煌中。