Les déclarations Scala suivantes sont correctes :
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] {
// ...
}
Mais les deux suivants ne le sont pas :
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] {
// ...
}
La différence est que j'ai supprimé le paramètre de type ID dans BaseWithIntID et MetaWithIntID, et que j'ai spécifié Int explicitement dans leurs traits de base respectifs. Mais cela ne compile pas, alors cela signifie-t-il que Int n'est pas comparable en Scala ? Si c'est le cas, qu'est-ce que je fais de mal ? J'ai essayé Ordered au lieu de Comparable, et cela n'a fait aucune différence.
J'utilise Eclipse et, comme d'habitude, les messages d'erreur ne m'aident pas :
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]]
Il indique simplement que quelque chose ne va pas, mais ne précise pas quel type de paramètre est incorrect, ni pourquoi. En regardant cette question J'ai pensé que je pourrais essayer "ID <% Comparable[ID]" à la place, mais ce n'est pas légal dans une déclaration de trait.
En fait, cela ne fonctionne pas non plus (avec le même message d'erreur) :
trait TestBase extends BaseWithID[TestBase,TestMeta,Int]
trait TestMeta extends Meta[TestBase,TestMeta,Int]