Je veux une classe pour forcer c'est sous-classes pour mettre en œuvre un sous-trait à un trait et a essayé ceci:annotation auto de type non reconnu par le compilateur
sealed trait TA
sealed trait TB extends TA
sealed trait TC extends TA
sealed trait CA {
this: TA =>
}
final class CB extends CA with TB
final class CC extends CA with TC
def ca: CA = if (scala.util.Random.nextBoolean) new CB()
else new CC()
def ta: TA = ca
Avec le code ci-dessous je reçois l'erreur du compilateur suivant:
Error:(16, 16) type mismatch;
found : CA
required: TA
def ta: TA = ca
- est-ce qu'un CA ne pas être un TA quand j'ai l'annotation de type auto: « ceci: TA => » ou est-ce un problème dans le compilateur?
- Existe-t-il de meilleures façons de mettre en œuvre cela?
Je souhaite qu'une classe (CA) force ses sous-classes (CB et CC) à implémenter un sous-type (TB ou TC) d'un trait TA. J'ai une méthode qui retourne une CA que je veux réutiliser dans des situations où l'aspect TA de la classe est nécessaire. Si j'ai CA étendre TA, ce ne serait pas une erreur de compilation si les sous-classes n'ont pas étendu TA ou TB. Il est intéressant que le compilateur accepte: def ca: TA = if (scala.util.Random.nextBoolean) nouveau CB() sinon nouveau CC() – user6919872
Oui, bien sûr, il l'accepte, car CB et CC sont des sous-classes de TA . CA ne l'est pas. Vous ne forcez pas vos sous-classes à implémenter une sous-classe de TA avec votre approche non plus. Ils pourraient encore juste étendre TA lui-même. – Dima