我无法使用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]
,那么重点是什么呢?这种拒绝?
找到清单的任何方法?
答案 0 :(得分:4)
您必须为所有参数提供清单,实际上创建了一个完整的清单链:
def emptyList[ S, A : Manifest ] {}
class Leaf[ S, A ]
def emptyTree[ S: Manifest, A : Manifest ] { emptyList[ S, Leaf[ S, A ]]}