在下面的函數共同下界,Scala編譯器能夠定義的返回類型以在如果/ 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
被定義爲返回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
}