В следующей функции, компилятор Scala способен определить тип возвращаемого значения к наименьшему общему надтипа значений, используемых в если/другое выражение:Определить общие нижние границы параметров
def cond(b: Boolean, t: A, f: B) = if (b) t else f
Учитывая следующее иерархия:
class X
class A extends X
class B extends X
функция cond
выше, определяется возвращает значение типа X
.
Однако, если A
и B
являются параметры типа в определении функции cond
, его возвращаемый тип Any
:
def cond[A, B](b: Boolean, t: A, f: B) = if (b) t else f
Можно ли сделать компилятор использовать наименьший общий супертип типа параметры?
Я пробовал некоторые вариации следующий без успеха:
def cond[A, B, R >: A with B](b: Boolean, t: A, f: B): R = if (b) t else f
def cond[A, B, R](b: Boolean, t: A, f: B)(implicit ev1: A <:< R, ev2: B <:< R): R = if (b) t else f
EDIT: Вопрос выше упрощен. На самом деле моя реальная проблема была одной из параметров типа уже решенных:
class C[A](b: Boolean, t: A) {
def cond[B](f: B) = if(b) t else f
}