J'ai aimé la réponse de Roland Ewald car il a décrit avec un cas d'utilisation très simple d'alias de type, et pour plus de détails, il a présenté un très beau tutoriel. Cependant, puisqu'un autre cas d'utilisation est introduit dans cet article nommé type members , je voudrais en mentionner le cas d'utilisation le plus pratique, que j'ai beaucoup aimé: (cette partie est tirée d' ici :)
Type de résumé:
type T
T ci-dessus dit que ce type qui va être utilisé, est encore inconnu, et en fonction de la sous-classe concrète, il sera défini. La meilleure façon de toujours comprendre les concepts de programmation est de fournir un exemple: supposons que vous ayez le scénario suivant:
Ici, vous obtiendrez une erreur de compilation, car la méthode eat dans les classes Cow et Tiger ne remplace pas la méthode eat dans la classe Animal, car leurs types de paramètres sont différents. C'est Herbe dans la classe Vache et Viande dans la classe Tigre vs Nourriture dans la classe Animal qui est super classe et toutes les sous-classes doivent se conformer.
Revenons maintenant à l'abstraction de type, par le diagramme suivant et en ajoutant simplement une abstraction de type, vous pouvez définir le type de l'entrée, en fonction de la sous-classe elle-même.
Maintenant, regardez les codes suivants:
val cow1: Cow = new Cow
val cow2: Cow = new Cow
cow1 eat new cow1.SuitableFood
cow2 eat new cow1.SuitableFood
val tiger: Tiger = new Tiger
cow1 eat new tiger.SuitableFood // Compiler error
Le compilateur est content et nous améliorons notre conception. Nous pouvons nourrir notre vache avec de la vache. La nourriture et le compilateur nous empêchent de nourrir la vache avec la nourriture qui convient à Tiger. Mais que se passe-t-il si nous voulons faire la différence entre le type de vache1 AppropriéFood et vache2 SuitabeFood. En un autre mot, il serait très pratique dans certains scénarios si le chemin par lequel nous atteignons le type (bien sûr via objet) importe fondamentalement. Grâce aux fonctionnalités avancées de scala, il est possible:
Types dépendant du chemin: les
objets Scala peuvent avoir des types comme membres. La signification du type dépend du chemin que vous utilisez pour y accéder. Le chemin est déterminé par la référence à un objet (c'est-à-dire une instance d'une classe). Afin d'implémenter ce scénario, vous devez définir la classe Grass à l'intérieur de la vache, c'est-à-dire que Cow est la classe externe et Grass est la classe interne. La structure sera comme ceci:
class Cow extends Animal {
class Grass extends Food
type SuitableFood = Grass
override def eat(food: this.SuitableFood): Unit = {}
}
class Tiger extends Animal {
class Meat extends Food
type SuitableFood = Meat
override def eat(food: this.SuitableFood): Unit = {}
}
Maintenant, si vous essayez de compiler ce code:
1. val cow1: Cow = new Cow
2. val cow2: Cow = new Cow
3. cow1 eat new cow1.SuitableFood
4. cow2 eat new cow1.SuitableFood // compilation error
À la ligne 4, vous verrez une erreur car Grass est maintenant une classe interne de Cow, par conséquent, pour créer une instance de Grass, nous avons besoin d'un objet vache et cet objet vache détermine le chemin. Donc 2 objets vache donnent lieu à 2 chemins différents. Dans ce scénario, cow2 veut uniquement manger de la nourriture spécialement créée pour elle. Alors:
cow2 eat new cow2.SuitableFood
Maintenant tout le monde est content :-)