Scala的类型系统中的错误?

时间:2011-01-06 11:25:44

标签: scala

以下scala代码似乎有效:

class A[X]
class C[M[X] <: A[X]]

class Main

new C[A]

我希望编译器在类型A上执行类型推断,但在我尝试以下操作之后:

new C[A[Int]]

我收到以下错误消息:

(fragment of Main.scala):11: error: this.A[Int] takes no type parameters, expected: one
println( new C[A[Int]] )

5 个答案:

答案 0 :(得分:15)

让我们用简单的英语看看这意味着什么。

class A[X]

表示:让A为一个带有一个类型参数的类。

class C[M[X] <: A[X]]

意味着:让C成为一个带有一个类型参数的类,它应该是一个带有一个类型参数的类AND,参数化,是一个用相同类型参数化的类A的子类。

写作时

new C[A]

你说的是:用A作为参数创建一个C实例。 A符合上述标准吗?是的,它是一个接受一个类型参数的类,参数化它是自身参数化的子类。

但是,当你写

new C[A[Int]]

您尝试给C,A [Int]的类型参数不符合条件:A [Int]不接受任何类型参数,编译器会告诉您。 (它也不是A [X]的子类。)

答案 1 :(得分:6)

试试这种语法。

class C[M <: A[_]]

这意味着C是一个带有一个类型参数的类,它应该是A的子类并且需要一个类型参数。

答案 2 :(得分:2)

您没有将X声明为C的类型参数。请尝试以下方法:

class C[X, M[X] <: A[X]]

答案 3 :(得分:1)

所有人都解释here,关注&#34;常见的陷阱&#34;部分,因为它是相当TLTR。

答案 4 :(得分:0)

你不想让你的班级参加一个类型的参数,你要不要拿两个!两种可能的解决方案:

class A[X] {
     type T = X
}
class C[M <: A[_]] {
     //use M#T if you want the type T was parameterized with.
}

或者,您可以这样做:

class A[X]
class C[T, M[A] <: A[A]] {
     //when you want the type, write M[T], not M.
}

然而,你可能想要的是这个:

class A[X]
class C[M <: A[_]]