【发布时间】:2011-07-24 09:33:44
【问题描述】:
以下 Scala 声明是可以的:
trait Base[B <: Base[B,M,ID], M <: Meta[B,M,ID], ID <: Comparable[ID]] {
// ...
}
trait Meta[B <: Base[B,M,ID], M <: Meta[B,M,ID], ID <: Comparable[ID]] extends Ordered[Meta[_,_,_]] {
// ...
}
trait BaseWithID[B <: BaseWithID[B,M,ID], M <: Meta[B,M,ID], ID <: Comparable[ID]] extends Base[B,M,ID] with Ordered[B] {
// ...
}
trait BaseWithIntID[B <: BaseWithIntID[B,M,ID], M <: MetaWithIntID[B,M,ID], ID <: Comparable[ID]] extends BaseWithID[B,M,ID] {
// ...
}
trait MetaWithIntID[B <: BaseWithIntID[B,M,ID], M <: MetaWithIntID[B,M,ID], ID <: Comparable[ID]] extends Meta[B,M,ID] {
// ...
}
但以下两个不是:
trait BaseWithIntID[B <: BaseWithIntID[B,M], M <: MetaWithIntID[B,M]] extends BaseWithID[B,M,Int] {
// ...
}
trait MetaWithIntID[B <: BaseWithIntID[B,M], M <: MetaWithIntID[B,M]] extends Meta[B,M,Int] {
// ...
}
不同之处在于我去掉了 BaseWithIntID 和 MetaWithIntID 中的 ID 类型参数,并在各自的基本特征中明确指定了 Int。但这不会编译,那么这是否意味着 Int 在 Scala 中不可比较?如果是,我做错了什么?我尝试了 Ordered 而不是 Comparable,但这并没有什么不同。
我正在使用 Eclipse,和往常一样,错误消息没有帮助:
type arguments [B,M,Int] do not conform to trait BaseWithID's type parameter bounds [B <: BaseWithID[B,M,ID],M <: Meta[B,M,ID],ID <: java.lang.Comparable[ID]]
它只是说有问题,但没有说哪个类型参数错了,为什么。看着this question,我想我可以尝试“ID
实际上,这也不起作用(带有相同的错误消息):
trait TestBase extends BaseWithID[TestBase,TestMeta,Int]
trait TestMeta extends Meta[TestBase,TestMeta,Int]
【问题讨论】:
-
ID <% Comparable[ID]的问题在于它自动定义了一个隐式参数。由于特征不允许有参数,所以它不起作用。但是,作为class,您可以做到。
标签: generics scala int comparable