система типов scala - понимание коварианта с нижними/верхними границами

Я новичок в scala, и у меня есть вопросы по дженерикам scala.

введите здесь описание изображения

Вопрос в том, как метод animalContainer.add принимает новый Cat. Насколько я понимаю, B>:A - A - животное, а B - кошка. Кошка НЕ ​​является супертипом животного. Как работает..


person Learn Hadoop    schedule 04.12.2019    source источник
comment
Я думаю, причина, по которой это не очевидно, заключается в том, что вы еще не реализовали свой метод add. Когда вы это сделаете, вы увидите, что компилятор позволит вам создать новый экземпляр Container[B] только для того, чтобы это работало, а когда вы создадите новый контейнер, это будет Container[Animal], а не Container[Dog].   -  person Yuval Itzchakov    schedule 04.12.2019
comment
Под B подразумевается не Cat, а скорее Animal.   -  person Luis Miguel Mejía Suárez    schedule 04.12.2019
comment
Спасибо за ваш ответ. при наведении курсора я получаю определение def add[B ›: Animal](element: B): Unit — я передаю новый метод Cat для добавления.. как это возможно cat›:Animal.. не могли бы вы объяснить в терминах непрофессионала   -  person Learn Hadoop    schedule 04.12.2019
comment
Вы должны понимать, что значение имеет много типов, а не один, поэтому new Cat имеет (среди прочего) типы Cat, Animal, AnyRef, Any и т. д. Таким образом, в этом случае необходимо вывести B, для этой цели компилятор пытается найти LUB< /b> между Animal и всеми типами new Cat, в данном случае подразумевается Animal.   -  person Luis Miguel Mejía Suárez    schedule 04.12.2019


Ответы (1)


B не кошка, B - животное. Таким образом, предполагаемый тип добавления выглядит следующим образом:

def add(element: Animal)

Вы можете передать Cat здесь, потому что Cat расширяет Animal.

person Brian McCutchon    schedule 04.12.2019
comment
тогда зачем нам добавлять [B›:A] в метод add. без этой строки я получаю ошибку времени компиляции.. - person Learn Hadoop; 04.12.2019
comment
Это другой вопрос. См. stackoverflow.com/questions/37334674/ - person Brian McCutchon; 04.12.2019