在以下函数中,Scala 编译器能够将返回类型定义为 if/else 表达式中使用的值的最低通用超类型:
def cond(b: Boolean, t: A, f: B) = if (b) t else f
考虑以下层次结构:
class X
class A extends X
class B extends X
上面的函数cond
被定义为返回一个 type 的值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
编辑:上面的问题过于简单化了。事实上,我真正的问题已经解决了其中一个类型参数:
class C[A](b: Boolean, t: A) {
def cond[B](f: B) = if(b) t else f
}