Je crois qu'une classe générique peut rendre l'une de ses méthodes disponibles uniquement en supposant que ses paramètres de type se conforment à certaines restrictions supplémentaires, comme (syntaxe improvisée sur place): i Devinez que je pourrais utiliser des paramètres implicites comme des preuves ... y a-t-il une fonctionnalité de langue pour cela? P> P>
3 Réponses :
Dans ce cas, vous ne pouvez utiliser qu'un paramètre implicite, car le type est déterminé avant l'appel de la méthode.
def foo[A : Something] = ???
Merci, je ne savais pas que [T: preuve] est une notation générale, je ne l'ai utilisée qu'avec des machines. Comment accéder au paramètre implicite d'une méthode de cette façon? De plus, la déclaration DEF SUM [T: numérique] code> Type de type Type de survol T?
Habituellement, vous utilisez cette notation lorsque vous utilisez d'autres méthodes qui attendent un paramètre de ce type dans le corps, mais vous pouvez également l'obtenir en appelant implicitement [quelque chose [A]] code>. Pour certains types, il peut même y avoir des getters, comme pour classtag code> il y a scala.reflect.classtag [a] code> qui prend implicitement l'instance code> classtag code> et le retourne juste. Vous pouvez également créer vos propres méthodes ou appliquer des méthodes de ce type sur les compagnons du type que vous passez implicitement.
Thx, je vais jouer avec ça.
Vous pouvez également utiliser un type lié em> sur le paramètre type, qui est appliqué par un argument implicite: Vous pouvez également utiliser pour une explication plus détaillée des contraintes de type, voir Alors question . P> p> <: << / code > est en fait une classe, exprimée en notation infixe, définie dans Pref.Scala et expliqué dans de nombreux endroits, y compris ici p> <: << / code> signifie 'doit être un sous-type de' p> =: = code> 'doit être égal à' et x <%
Il existe une autre option impliquant des conversions de classes implicites dans ce contexte, vous n'avez plus besoin du col de trait vide, de sorte que vous puissiez le compromettre davantage à ceci: p> < Pré> xxx pré> L'avantage de cette méthode est, qu'il indique au compilateur, que Type T est vraiment un sous-type d'int, donc list [t] <: liste [int] code > est toujours valable dans ce contexte et aucune conversion explicite n'a besoin d'être ajoutée. Le paramètre implicite ajoute des conversions implicites qui ne fonctionnaient pas sur liste [t] code>, car il n'entre qu'une conversion implicite de t code> sur int code>, Pas de Liste [T] code> à Liste [int] code> p> p> p>