Почему бы не установить ковариант по умолчанию при определении подтипа в Scala?

Это значит определить trait Option[T] такой же как trait Option[+T],

Это легко рассмотреть val humanOpt: Option[Human] может указать на Option[Student] например, как val humanOpt: Human может указать на Student пример.

Может быть, это кажется странным, но почему я считаю это?

Переменная Java по умолчанию как полиморфизм, который сравнивают с C++, который она должна использовать virtual Ключевое слово. Я считаю важным упростить OO в Java.

Во многих случаях Scala использует тип высокого порядка, который чаще сравнивают с Java, например Option, Try или определить Cache[T] нами.

Кроме того, он по-прежнему соответствует принципу подстановки Лискова.

Я просто хочу знать, почему бы не упростить ковариант как поведение по умолчанию?

1 ответ

Решение

или определить кэш [T] сами

Если твой Cache имеет put(T) метод, он не может быть ковариантным, именно из-за принципа подстановки Лискова.

val humanCache: Cache[Human] = new Cache[Student] // legal if cache is covariant
humanCache.put(new Professor) // oops, we put a Professor into a Cache[Student]

Поэтому сделать все типы ковариантными по умолчанию просто не получится.

Вместо этого вы можете использовать дисперсионный вывод: если тип может быть ковариантным, сделать его ковариантным, если он может быть контравариантным, сделать, если контравариантным, если ни один из них не сделать его инвариантным. Но тогда просто добавление метода может изменить дисперсию и сломать много кода, используя ваш тип. Делая все различия явно, вы вынуждены заметить, когда вы делаете это.

Другие вопросы по тегам