Подсказка Intellij для типа вывода метода scala

#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] .