编译器在调用站点推断类型参数(当计算常见的超类型时)

时间:2017-04-03 15:09:55

标签: scala generics

v2编译。我希望能够像v1示例中那样调用我的apply方法。编译器似乎太快,无法将Nothing分配给我的R变量

(推断类型参数[... A,Nothing]不符合方法apply的类型参数bounds [T1<:Nothing,T2<:Nothing]   val v1 = apply(3)(new A)(new B))

class C
class A extends C
class B extends C

object O {
def apply[T1 <: R, T2 <: R, R](d : Int)(succ : T1)(fail : T2): R = if (d<0) succ else fail

  val v1 = apply(3)(new A)(new B)

  val v2 = apply[A, B, C](3)(new A)(new B)
}

2 个答案:

答案 0 :(得分:0)

如上所述,我只是将签名简化为def apply[R](d: Int, succ: R, fail: R): R。如果您的原始签名有,则它具有合法类型参数,但编译器可以更好地推断单个剩余类型参数。

答案 1 :(得分:0)

所以我想我已经为我的问题找到了解决方案。我认为在添加两种不同类型时,集合会做类似的事情。所以这是自动推断其结果的东西:

def apply[S, R >: S](d : Int)(succ : S, fail : R): R = if ( d < 0 ) succ else fail

奇怪的是只有当succ&amp; fail属于同一个参数列表。我想知道为什么会这样。