Следующие объявления 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 и явно указал Int в их соответствующих базовых чертах. Но это не компилируется, значит ли это, что Int не является сопоставимым в Scala? Если это так, что я делаю не так? Я попытался заказать вместо 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]]
Это просто говорит о том, что что-то не так, но не то, какой параметр типа неверен и почему. Глядя на этот вопрос , я подумал, что мог бы вместо этого попробовать «ID <% Comparable [ID]», но это недопустимо в объявлении черты. </p>
На самом деле, это тоже не работает (с тем же сообщением об ошибке):
trait TestBase extends BaseWithID[TestBase,TestMeta,Int]
trait TestMeta extends Meta[TestBase,TestMeta,Int]