c'est donc un port assez directe de this Java question à scalaÉviter les paramètres génériques redondants dans Scala
Nous avons un tas de caractéristiques qui prennent des paramètres génériques comme suit:
trait Ident { }
trait Container[I <: Ident] {
def foo(id: I): String
}
trait Entity[C <: Container[I], I <: Ident] {
def container: C
def foo(id: I) = container.foo(id)
}
Cela fonctionne, mais il est un peu clumbsy, puisque nous devons fournir le type de l'Ident et le type du Container lors de la définition d'une sous-classe de Entity. Quand en fait seulement le type du conteneur serait assez d'informations de type par lui-même:
class MyIdent extends Ident { }
class MyContainer extends Container[MyIdent] { }
class MyEntity extends Entity[MyContainer,MyIdent] { }
// ^^^^^^^ shouldn't really be necessary
En utilisant un type existentiel évite la nécessité d'une entité de prendre deux paramètres ... mais bien sûr vous ne pouvez pas s'y référer plus tard.
trait Entity[C <: Container[I] forSome { type I <: Ident }] {
def container: C
def foo(id: I) = container.foo(id)
// ^^^ complains it has no idea what 'I' is here
}
De même la conversion de la chose à utiliser des types de membres ne travaillent pas non plus ...
trait Ident { }
trait Container {
type I <: Ident
def foo(id: I): String
}
trait Entity {
type C <: Container
def container: C
def foo(id: C#I) = container.foo(id)
// ^^ type mismatch
}
Cela veut-il que quelqu'un sait s'il y a une solution élégante à ce problème à Scala?
Je ne pense pas que la réponse soit très différente de la version Java. Il n'y a pas vraiment moyen d'omettre le paramètre type sans perdre l'information de type qui l'accompagne. –
Est-ce une option pour rendre 'container' un' val'? – sepp2k
@MichaelZajac Donc dans la définition de "MyEntity" le deuxième paramètre fourni à Entity est redondant: il n'y a tout simplement pas d'autre type possible que "MyIdent", littéralement tout autre chose donnera des erreurs de compilation. Bien sûr, si vous pouvez éviter cette redondance dans Scala est une autre question :-) –