#scala #intellij-idea
Вопрос:
Я написал метод в программе scala в Intellij, подобный этому:
def myMethod(c: Option[C]) = {
val x = ...
val y = ...
c.filter(...)
.map(_ => {
(x,y) match {
case (a,b) => "val1"
case (c,d) => "val2"
case (_, _) => "val3"
}
})
}
Intellij указывает, что тип вывода этого метода-Опция[Строка]. Но поскольку я использовал метод фильтра , который может не возвращать ничего, так не является ли эта подсказка неправильной?
Комментарии:
1. Ваш вопрос звучит для меня противоречиво. В IDE говорится, что метод возвращает параметр. Ваш
filter
, как вы правильно заметили, возвращает опцию. И все же вы говорите, что IDE ошибается, соглашаясь с вами? Я не понимаю.2. Но если фильтр не вернет ни одного, карта даже не будет применена. Поэтому не следует возвращать тип, который является общим предком None и Option[String].
Ответ №1:
object None
расширяться Option[Nothing]
.
Nothing
является «нижним типом», то есть наследуется от всего.
Option
является ковариантным по параметру типа.
Это означает, что None
это потомок Option[X]
любого и каждого возможного X
.
Таким образом, LUB (Наименьшая верхняя граница) между None
и Option[String]
есть Option[String]
.