Je viens de commencer à apprendre scala. J'essayais d'écrire une fonction pour inverser une liste de n'importe quel type arbitraire.erreur de "type incompatibilité" lors de l'utilisation: + méthode sur une liste
Voici le code:
def reverse [A] (l:List[A]):List[A] = {
val size:Int = lenList(l) // i have implemented this func separately
if (l.isEmpty) List()
else {
var newList = List()
for (i <- 1 to size)
{
var temp = l(size - i)
newList = newList :+ temp //type mismatch error here
}
newList
}
}'
Ceci est l'erreur lorsque le code ci-dessus a été compilé:
Quand j'ai changé la déclaration newList
-var newList = List[A]()
(qui est le même type comme la liste passée en paramètre) le code compilé avec succès.
Ma question est:
Pourquoi est-il une incompatibilité de type sur la ligne
newList = newList :+ temp
lorsquenewList
est de typeList[Nothing]
ettemp
est un élément detype A
?Pourquoi le compilateur dit
Found:List[A]
lorsqu'il n'y a pas de typeList[A]
impliqué dans l'instruction?Quelqu'un pourrait-il me dire la raison pour laquelle cette erreur d'incompatibilité de type particulier s'est produite?
Aussi, je veux savoir la raison pour laquelle le code compilé lorsque j'ai changé la déclaration?
Quel effet ma déclaration a-t-elle eu sur l'instruction qui lançait initialement l'erreur?
Je crois ci-dessous un message d'erreur aurait été justifiée dans cette situation
found:List[Nothing]
Required:List[A]
plutôt que ce que je rencontrais:
found:List[A]
Required:List[Nothing]
Comme newList
de type List[Nothing]
a été utilisé dans la déclaration et l'élément que j'ai essayé d'ajouter était de type A
alors il est compréhensible que le type requis soit List[A]
.
appel à 'Liste()' correspond à l'usine 'List.apply [T]', où 'T' est déduit comme' Rien comme vous ne le spécifiez pas, ni sur la déclaration 'val' en indiquant le type explicite ou sur l'appel d'usine. soit 'val newList: Liste [A] = List()' ou 'val newList = List.empty [A]' – cchantep