Scala n00b здесь. Довольно уверен, что я понимаю PDT, но убедился и столкнулся с проблемой; вот предыдущий вопрос Scala types: Class A is not equal to the T where T is: type T = A с примерами кода, который я воспроизвести здесь:Пример зависимых типов пути не работает
1: class Food
2: class Fish extends Food
3: class Grass extends Food
4:
5: abstract class Animal {
6: type SuitableFood <: Food
7: def eat(food: SuitableFood)
8: }
9:
10: class Cow extends Animal {
11: type SuitableFood = Grass
12: override def eat(food: Grass) {}
13: }
14:
15: val bessy: Animal = new Cow // [1]
16:
17: bessy eat (new bessy.SuitableFood) // [2]
оригинальный плакат сказал, что это компилируется, я считаю, что должен, но это не будет. Если я вставить его в лестницу РЕПЛ успешно создает Бесси [1]:
scala> val bessy: Animal = new Cow
bessy: Animal = [email protected]
но [2], дает мне ошибку, которую я не понимаю:
scala> bessy.eat(bessy.SuitableFood)
<console>:17: error: value SuitableFood is not a member of Animal
bessy.eat(bessy.SuitableFood)
^
Если я вставить его в файл и 'scalac' он, я получаю то же самое. Зачем? bessy
- объект коровы, type SuitableFood = Grass
определен в нем, bessy.SuitableFood
- тип класса (не так ли?). Что случилось?
У меня нет точки № 1, там есть «новый» прямо в вашей копии моего кода. Можете ли вы указать, какая строка имеет недостатки? Я добавил номера строк в оригинал, чтобы помочь. Повторите свой второй пункт: «После того, как вы исправите это, bessy определяется как тип Animal, а не Cow, поэтому компилятор не знает bessy.SuitableFood - это Grass« Действительно! Поэтому я подумал, что «новый bessy.SuitableFood» вернет подходящую пищу, потому что .SuitableFood будет своего рода виртуальным типом, поэтому, когда - «Корова», тогда «Подходящий» будет «травой». Я не вижу значения PDT, если они этого не делают. –
user3779002
"[2], дает мне ошибку, которую я не понимаю:' scala> bessy.eat (bessy.SuitableFood) '.Здесь нет 'нового'. –
«Следовательно, я думал, что« новый bessy.SuitableFood »вернет подходящую пищу, потому что .SuitableFood будет своего рода виртуальным типом« Но почему вы ожидаете, что этот тип будет иметь конструктор без параметров? Я отредактировал ответ, чтобы объяснить, как это сделать правильно. –