表现较高的类型缺失

时间:2011-11-21 19:16:10

标签: scala manifest higher-kinded-types

我无法使用scalac找不到我想要使用的更高级内部类型的清单。考虑一些带有构造函数的类型列表:

trait L[S, A]

def emptyList[S, A: Manifest]: L[S, A] = ???

现在是另一种类型,它从它的伴侣对象构造出来:

object Tree {
  private class Leaf[S, A]
  private class Impl[S, A](l: L[S, Leaf[S, A]]) extends Tree[S, A]

  def empty[S, A]: Tree[S, A] = new Impl(emptyList[S, Leaf[S, A]])
}
trait Tree[S, A]

失败是因为scalac需要类型Leaf[S, A]的清单。为什么不可用?我不想通过要求传递清单参数来放松Leaf的可见性并使构造函数混乱。

我根本不明白这一点 - 我认为从JVM的角度来看,L中构造的数组可以归结为Array[Leaf[_, _]]又名Array[java.lang.Object],那么重点是什么呢?这种拒绝?

找到清单的任何方法?

1 个答案:

答案 0 :(得分:4)

您必须为所有参数提供清单,实际上创建了一个完整的清单链:

def emptyList[ S, A : Manifest ] {}
class Leaf[ S, A ]
def emptyTree[ S: Manifest, A : Manifest ] { emptyList[ S, Leaf[ S, A ]]}