以下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]] )
答案 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[_]]