Voici une installation simple avec deux traits, une classe avec un paramètre de type covariant délimitée par les traits précédents et une deuxième classe avec un paramètre de type délimité par l'autre classe. Pour les deux classes, une méthode particulière est disponible (via des preuves implicites) uniquement si l'un des deux traits sous-tend le paramètre de type. Cela compile bien: Cependant, car avec l'erreur: p> Pourquoi la preuve implicite n'est-elle pas prise en compte ? p> p> bar code> est covariant dans
f code>, je ne devrais pas avoir besoin du
f Code> Paramètre dans
Grill code>. Je devrais simplement exiger que
B code> est un sous-type de
bar [lisiblefoo] code>. Ceci, cependant, échoue: p>
3 Réponses :
L'appel Le problème, je pense que pour appeler Quoi qu'il en soit. La bonne chose est que vous en savez plus que le compilateur et vous pouvez faire appel à la conversion explicitement, soit à l'aide de la méthode Il existe une autre possibilité qui pourrait être la plus propre, car elle ne s'appuie pas sur la mise en œuvre de bar.readfield code> est possible car l'instance de preuve
<: << / code> permet une conversion implicite de
B code> sur
bar [ Lisiblefoo] code>.
readfield code> Vous avez besoin d'un paramètre de preuve successif
F <:
readfield code>, il faut juste
bar code> en premier lieu). Et puis, il étouffe la deuxième résolution implicite, car il n'y a aucune forme de «retour en arrière» autant que je sache. P>
Appliquer code> de
<: << / code> ou à l'aide de la méthode de l'aide.
implicitement code>: p>
<: code> qui pourrait être un problème car @kaito suggère: p>
Je ne sais pas si <: <:
@Kaito: Avez-vous des preuves que
@TravisBrown: aucun. Mais je ne trouve pas la ligne qui documente réellement verbalement le comportement de la fonction, juste l'explication héritée du trait de fonction abstraite1. Je conviens que c'est gentil mais je ne suis pas sûr que ce comportement puisse être invoqué, il pourrait aussi bien lancer une exception dans la prochaine version que je pense.
@Kaito: Il n'y a pas de traitement magique ou spécial dans
@Sciss hm, je ne vois tout simplement pas les contraintes de type comme des conversions implicites, mais je suppose qu'il est logique qu'ils doivent être compatibles avec d'autres conversions puisqu'elles se trouvent également à la vue des limites de la vue.
<: << / code> 's
appliquer code> n'est pas censé être appelé? C'est Comportement documenté A >. Vous pouvez écrire
(barre: barre [lisiblefoo]). Lisezfield CODE> et laissez la conversion implicite au courant automatiquement, mais la version de Scis se sent propre pour moi.
<: << / code> par le compilateur. C'est une conversion implicite (et donc
appliquer code> sera normalement appelée); Ce n'est pas une contradiction avec le fait qu'en raison de la covariance du type de retour de la fonction, elle agit en tant que fonction d'identité. Voir Le code source Sur la manière dont
appliquer code> fonctionne, et plus important encore de savoir comment l'implicite est construit (méthode
conforme code>). Donc, vous avez raison, cela fait un typaste sûr, mais encore une fois, c'est exactement ce qui se passe implicitement.
0 __ Réponse (Utilisez l'argument de la preuve implicite pour activer On vaut la peine de noter que la situation que vous décrivez des sons comme s'il s'agissait d'une bonne affaire pour le polymorphisme ad hoc via des classes de type, cependant . Dis par exemple que nous avons la configuration suivante: p> et une classe de type, ainsi que quelques méthodes de commodité pour créer de nouvelles instances et pour PIMPING A et quelques instances: p> Et enfin un Cela nous permet de faire ce qui suit, par exemple: p> ce que nous voulons. p> p> bar code> dans le type de droite) est la réponse que vous donnerais à la question spécifique que vous avez posée (bien que je suggère d'utiliser non l'utilisation de
implicitement code> si vous avez l'argument implicite assis là-bas).
Readfield < / Code> Procédé sur n'importe quel type qui a une instance dans la portée: p>
FOO code>: p>
Ce n'est pas une réponse à la question, mais de montrer que la "contrainte de type" n'est vraiment qu'une conversion implicite:
Je suis au courant de la façon dont ça fonctionne. La question que je demandais est simplement de savoir si c'est le comportement prévu et peut être invoqué dans les futures mises à jour. La documentation mentionne uniquement qu'elles sont des contraintes de type, pas leur utilisation comme des conversions implicites.