以下Scala的聲明是確定:Scala泛型:Int不符合Comparable?
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明確他們各自的基本特徵。但是這不能編譯,那麼這是否意味着在Scala中Int不是Comparable?如果是這樣,我做錯了什麼?我嘗試了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 <%Comparable [ID]」,但這在特質聲明中不合法。
其實,這並不工作,要麼(與相同的錯誤消息):
trait TestBase extends BaseWithID[TestBase,TestMeta,Int]
trait TestMeta extends Meta[TestBase,TestMeta,Int]
ID <%Comparable [ID]'的問題是它會自動定義一個隱式參數。由於特徵不允許有參數,它不會工作。然而,作爲一個班級,你可以做到。 –