次の 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] {
// ...
}
ただし、次の 2 つはそうではありません。
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 で Comparable ではないということですか? もしそうなら、私は何を間違っていますか?Comparable の代わりに Ordered を試しましたが、違いはありませんでした。
私は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]]
何かが間違っていると言っているだけで、どの型パラメーターが間違っているのか、そしてその理由はわかりません。この質問を見て、代わりに「ID <% Comparable[ID]」を試すことができると思いましたが、それは特性宣言では合法ではありません。
実際には、これも機能しません (同じエラー メッセージが表示されます)。
trait TestBase extends BaseWithID[TestBase,TestMeta,Int]
trait TestMeta extends Meta[TestBase,TestMeta,Int]