8
votes

Méthodes conditionnelles de classes génériques Scala avec des restrictions pour les paramètres de type

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): xxx

i Devinez que je pourrais utiliser des paramètres implicites comme des preuves ... y a-t-il une fonctionnalité de langue pour cela?


0 commentaires

3 Réponses :


4
votes

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] = ???


3 commentaires

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] 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]] . Pour certains types, il peut même y avoir des getters, comme pour classtag il y a scala.reflect.classtag [a] qui prend implicitement l'instance classtag 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.



8
votes

Vous pouvez également utiliser un type lié sur le paramètre type, qui est appliqué par un argument implicite: xxx

<: << / 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

<: << / code> signifie 'doit être un sous-type de'

Vous pouvez également utiliser =: = 'doit être égal à' et x <% 'doit être visible comme "(c'est-à-dire une conversion implicite sur x de y)

pour une explication plus détaillée des contraintes de type, voir Alors question .


0 commentaires

1
votes

Il existe une autre option impliquant des conversions de classes implicites xxx

dans ce contexte, vous n'avez plus besoin du col de trait vide, de sorte que vous puissiez le compromettre davantage à ceci: < Pré> xxx

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] 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] , car il n'entre qu'une conversion implicite de t sur int , Pas de Liste [T] à Liste [int]


0 commentaires