Следующие объявления 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] {
// ...
}
Разница в том, что я удалил параметр типа ID в BaseWithIntID и MetaWithIntID и явно указал Int в соответствующих базовых трейтах. Но это не компилируется, значит ли это, что Int не является Comparable в 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]]
Это просто говорит о том, что что-то не так, но не о том, какой параметр типа неверен и почему. Глядя на этот вопрос , я подумал, что мог бы вместо этого попробовать "ID ‹% Comparable[ID]", но это недопустимо в объявлении трейта.
На самом деле это тоже не работает (с тем же сообщением об ошибке):
trait TestBase extends BaseWithID[TestBase,TestMeta,Int]
trait TestMeta extends Meta[TestBase,TestMeta,Int]
ID <% Comparable[ID]
заключается в том, что он автоматически определяет неявный параметр. Поскольку трейты не могут иметь параметры, это просто не сработает. Однако, какclass
, вы могли бы это сделать. - person Daniel C. Sobral   schedule 26.07.2011