6

说我有:

class Class[CC[A, B]]
class Thing[A, B <: Int]
class Test extends Class[Thing] // compile error here

我得到编译器错误:

类型参数 (cspsolver.Thing) 的种类不符合 Class 类中类型参数的预期种类 (CC 类型)。csp求解器。
Thing 的类型参数与类型 CC 的预期参数不匹配:类型 C 的边界 <:Int 比类型 B 的声明边界更严格 >:Nothing <:Any

但是,当我修改代码使其看起来像这样时:

class Class[CC[A, B]]
class Thing[A, B] {
  type B <: Int
}
class Test extends Class[Thing]

它编译得很好。它们在功能上不是等效的吗?

4

2 回答 2

1

原因在编译器消息中给出。在Class您期望一个不受限制的情况CC下,同时Thing具有第二个类型参数必须是的限制<: Int。一种可能性是添加相同的约束,Class

class Class[CC[A,B <: Int]]
class Thing[A, B <: Int]
class Test extends Class[Thing]
于 2013-08-06T07:28:18.290 回答
0

详细阐述 Petr Pudlák 的解释,这是我假设发生的情况:编译器试图CC[A, B]Thing[A, B <: Int]. 根据Bin的声明CC,B的上界类型是Any, 被选中来实例化B. 但是,Bin Thing应该具有Int其上限类型,因此编译器会失败并显示您收到的错误消息。

为了保持类型系统的健全性,这是必要的,如下图所示。假设Thing定义了一个依赖于它的事实的操作B <: Int,例如,

class Thing[A, B <: Int] {
  def f(b: B) = 2 * b
}

如果您声明Class

class Class[CC[A,B]] {
  val c: CC
}

并且Test作为

class Test extends Class[Thing] {
  val t: Thing
}

没有编译器抱怨,那么您可以进行以下调用

new Test().t.f(true)

这显然是不安全的。

于 2013-08-06T08:01:28.823 回答