Supposons que j'ai deux classes, C'est bon si une entrée code> code> et J'ai une méthode code> code> ailleurs, qui définit un lien entre une entrée Si j'appelle cette méthode ci-dessous, je reçois une erreur de type: p> entrée code> et
sortie code>, qui sont conçus pour être connectés les uns aux autres.
sortie code> produit des valeurs de type, et
entrée code> les consomme.
Sortie CODE> PAIR Ne fonctionne pas sur le même type de valeur tant que le paramètre code> entrée code> est un super-type du paramètre code> de type code>. Notez que le paramètre de type dans les deux classes est invariant; Dans les versions réelles, il est utilisé à la fois dans des positions de co et de contravérie. P>
code> /
sortie code> paire: p>
test.scala:17: error: type mismatch;
found : Output[String]
required: Output[AnyRef]
connect(out, in)
^
3 Réponses :
Vous obtiendrez parfois de meilleurs résultats si vous utilisez plusieurs listes de paramètres: ... et en fait dans ce cas, cela fonctionne. P> P>
Pouvez-vous développer pourquoi c'est? "Parfois, obtenez de meilleurs résultats" i> ne semble pas très déterministe!
Malheureusement, le déducteur de type n'est pas spécifié et n'est parfois pas déterministe non plus.
Je suis peut-être totalement faux, mais je pense que le problème est que lorsque vous attachez ensemble l'entrée et la sortie:
L'entrée a une sortie limitée à un sous-type de T, mais la sortie a une entrée limitée à un super-espèce de T, le seul type pouvant satisfaire les deux conditions est T. lorsque vous créez L'entrée avec la sortie (remplaçant Q avec _ <: T) vous obtenez: p> identique à p> entrée [t] -> entrée [ _ <: T <: _] p> d'où la désactivation de type p> p>
Dans mon exemple, String et Anyref satisfont mes contraintes. La sortie produit des chaînes et nécessite une entrée qui consomme un super-espèce de chaîne. L'entrée consomme AnyRefs et nécessite une sortie qui produit un sous-type de AnyRef. Puisque la chaîne est un sous-type de AnyRef, les contraintes sont satisfaites.
Le problème est qu'il existe exactement un paramètre de type approprié pour la connexion, et c'est le paramètre de type de la sortie. Lorsque je spécifie cela explicitement, cela fonctionne bien. Si je ne le fais pas, il essaie d'utiliser le paramètre de type de l'entrée et d'obtenir une erreur de type sur l'argument de sortie.
Désolé, j'ai mal interprété l'entrée [_>: T] dans la signature de Connect [t] (
En réalité, Scala Type Inferene ne peut pas gérer "Récursion" pour l'instant. Donc, si le type d'argument ne peut être déduit que dans la collocation avec d'autres arguments Scala ne parvient pas à infercer. Mais si vous utilisez DiffNT Argument List Scala PS Il est trop simplifié, mais peut vous obtenir un indice. p> F (a) (A) (B) (C, D) Code> déduira les types de types de liste par liste, de sorte qu'il fonctionne de manière utile. P>
Voulez-vous dire "Ne pas utiliser sur i> le même type de valeur"
Avez-vous essayé de poser la question à la liste de diffusion Scala?