Почему бы не установить ковариант по умолчанию при определении подтипа в 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]
Поэтому сделать все типы ковариантными по умолчанию просто не получится.
Вместо этого вы можете использовать дисперсионный вывод: если тип может быть ковариантным, сделать его ковариантным, если он может быть контравариантным, сделать, если контравариантным, если ни один из них не сделать его инвариантным. Но тогда просто добавление метода может изменить дисперсию и сломать много кода, используя ваш тип. Делая все различия явно, вы вынуждены заметить, когда вы делаете это.