Contrainte de type récursive avec type prédéfini
Dans les génériques Go, il est possible de spécifier des contraintes de type sur les types génériques à l'aide d'interfaces. Cependant, il peut être difficile de définir une contrainte qui nécessite l'implémentation d'une méthode avec un argument de type générique lui-même.
Le projet actuel des génériques Go ne permet pas contraintes de type récursif, rendant impossible l’obtention du comportement souhaité. Par exemple, considérons l'interface suivante :
type Lesser interface { Less(rhs Lesser) bool }
Nous pouvons implémenter cette interface pour un type personnalisé, tel que Int :
type Int int func (lhs Int) Less(rhs Int) bool { return lhs < rhs }
Cependant, la compilation du code suivant échouera car Int ne satisfait pas l'interface Lesser :
func IsLess[T Lesser](lhs, rhs T) bool { return lhs.Less(rhs) } func main() { IsLess[Int](Int(10), Int(20)) }
Une solution de contournement pour cette limitation est pour définir une interface générique qui se référence en tant que paramètre de type :
type Lesser[T any] interface { Less(T) bool }
Cette interface spécifie que tout type qui implémente l'interface Lesser doit avoir une méthode Less qui prend un argument du même type.
Nous pouvons ensuite définir la fonction IsLess à l'aide de cette interface générique :
func IsLess[T Lesser[T]](x, y T) bool { return x.Less(y) }
Maintenant, nous pouvons implémenter des types personnalisés qui remplissent la Lesser contrainte :
type Apple int func (a Apple) Less(other Apple) bool { return a < other } type Orange int func (o Orange) Less(other Orange) bool { return o < other }
L'utilisation de la fonction IsLess avec ces types personnalisés entraînera un comportement correct :
func main() { fmt.Println(IsLess(Apple(10), Apple(20))) // true fmt.Println(IsLess(Orange(30), Orange(15))) // false }
Cette solution applique efficacement la contrainte de type récursif en nécessitant l'implémentation d'une méthode avec un argument de type générique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!