首页 文章

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

提问于
浏览
0

只有 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

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

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

    奇怪的是,仅当succ和fail属于同一参数列表时才有效 . 我想知道为什么会这样

  • 0

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

相关问题