Мені сподобалась відповідь від Роланда Евальда, оскільки він описав дуже простий випадок використання псевдоніма типу, а для більш детальної роботи представив дуже приємний підручник. Однак, оскільки інший випадок використання введено в цю посаду з назвою членів типу , я хотів би згадати найбільш практичний випадок використання цього, який мені дуже сподобався: (ця частина взята звідси :)
Тип реферату:
type T
T вище говорить, що цей тип, який буде використовуватися, поки невідомий, і залежно від конкретного підкласу він буде визначений. Найкращий спосіб розуміння понять програмування - це приклад: Припустимо, у вас такий сценарій:
Тут ви отримаєте помилку компіляції, оскільки метод поїдання в класах Корова та Тигр не змінюють метод їжі в класі Animal, оскільки їхні параметри відрізняються. Це Трава в класі Корова, М'ясо в класі Тигр проти Їжа в класі Тварина, який є супер класом, і всі підкласи повинні відповідати.
Повернімося до абстракції типу, на наступній схемі та просто додавши абстракцію типу, ви можете визначити тип введення відповідно до самого підкласу.
Тепер подивіться наступні коди:
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
Компілятор задоволений, і ми вдосконалюємо наш дизайн. Ми можемо годувати свою корову коровою. Підходящий корм та компілятор заважають нам годувати корову їжею, яка підходить для тигра. Але що робити, якщо ми хочемо зробити різницю між типом корови1 підходящої їжі та коровою2 SuitabeFood. Іншим словом, у деяких сценаріях було б дуже зручно, якщо шлях, яким ми доходимо до типу (звичайно через об’єкт), має значення. Завдяки вдосконаленим функціям в масштабі Scala, можливо:
Типи, залежні від шляху:
об'єкти Scala можуть мати типи як члени. Значення типу залежить від шляху, яким ви користуєтесь для доступу до нього. Шлях визначається посиланням на об'єкт (він же екземпляр класу). Для реалізації цього сценарію потрібно визначити клас Трава всередині Корови, тобто Корова - це зовнішній клас, а Трава - внутрішній клас. Структура буде такою:
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 = {}
}
Тепер, якщо ви спробуєте скласти цей код:
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
У рядку 4 ви побачите помилку, оскільки Трава зараз є внутрішнім класом Корова, тому для створення екземпляра Трави нам потрібен коров’ячий об’єкт, і цей корівний об’єкт визначає шлях. Таким чином, 2 коров’ячих об'єкта породжують 2 різних шляху. У цьому випадку корова2 хоче лише їсти спеціально створену для неї їжу. Так:
cow2 eat new cow2.SuitableFood
Тепер всі раді :-)