Scala的类型系统中的错误?

tim*_*tim 5 scala

以下scala代码似乎有效:

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

class Main

new C[A]
Run Code Online (Sandbox Code Playgroud)

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

new C[A[Int]]
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

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

Knu*_*daa 15

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

class A[X]
Run Code Online (Sandbox Code Playgroud)

意思是:让A成为一个带有一个类型参数的类.

class C[M[X] <: A[X]]
Run Code Online (Sandbox Code Playgroud)

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

当你写作

new C[A]
Run Code Online (Sandbox Code Playgroud)

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

但是,当你写作

new C[A[Int]]
Run Code Online (Sandbox Code Playgroud)

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


Cra*_*lin 6

试试这个语法.

class C[M <: A[_]]
Run Code Online (Sandbox Code Playgroud)

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


Mad*_*doc 2

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

class C[X, M[X] <: A[X]]
Run Code Online (Sandbox Code Playgroud)