仅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)
}
答案 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属于同一个参数列表。我想知道为什么会这样。