只有 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 回答
所以我想我已经为我的问题找到了解决方案 . 我认为在添加两种不同类型时,集合会做类似的事情 . 所以这是自动推断其结果的东西:
奇怪的是,仅当succ和fail属于同一参数列表时才有效 . 我想知道为什么会这样
如上所述,我只是将签名简化为
def apply[R](d: Int, succ: R, fail: R): R
. 如果您的原始签名有,则它具有合法类型参数,但编译器可以更好地推断单个剩余类型参数 .