任何人都可以解释一下,为什么以下代码不起作用,我该怎么做才能使它工作?
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]]
答案 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在不同的高级种类之间的类型推断,在其所有的辉煌中。