następujące deklaracje Scala są OK:Scala generics: Int nie odpowiada porównywalnemu?
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] {
// ...
}
Ale po dwa nie są:
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] {
// ...
}
Różnica polega na tym, że usuwa parametr typu ID w BaseWithIntID i MetaWithIntID i określony Int wyraźnie w ich odpowiednie cechy podstawowe. Ale to się nie kompiluje, więc czy to oznacza, że Int nie jest porównywalne w Scali? Jeśli tak, to co robię źle? Próbowałem Zamówione zamiast Porównywalne i nie robiło to różnicy.
Używam Eclipse, i jak zwykle, komunikaty o błędach są bezużyteczne:
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]]
To po prostu mówi, że coś jest nie tak, ale nie który parametr typ jest źle i dlaczego. Patrząc na this question, pomyślałem, że mogę spróbować "ID <% Porównywalne [ID]", ale nie jest to zgodne z deklaracją cechy.
Właściwie, to nie działa albo (z tego samego komunikatu o błędzie):
trait TestBase extends BaseWithID[TestBase,TestMeta,Int]
trait TestMeta extends Meta[TestBase,TestMeta,Int]
Problem 'ID <% porównawczych [id]' jest automatycznie określa parametr niejawny. Ponieważ cechy nie mogą mieć parametrów, po prostu nie będą działać. Jako "klasa" możesz jednak to zrobić. –