【发布时间】:2015-09-11 03:51:04
【问题描述】:
如果我要说出关于 scala 的最烦人的事情,那就是以下代码:
trait G[+T]
class H[+T] extends G[T]
def f[A<:G[X], X<:Int](g :A)
val g :H[Int]
f(g)
编译器推断最后一次调用 f[H[Int], Nothing] 的类型并在我面前抱怨它自己的愚蠢。
然而,了解 scala,它实际上比我更了解。背后的原因是什么?由于 G 和 H 对于 T 都是协变的,S <: G[X] with H[_] <=> S<: H[X] 对于任何类型 S。这个缺点使我设计一切都避免必须明确指定类型 - 它在这里可能看起来什么都没有,但是当名称变为“真实”时长度和几乎任何方法都是泛型的,并且经常处理两种泛型类型,结果大部分代码都是类型声明。
编辑: 上面的情况在下面被Noah解决了,但是当派生类和基类不一样时怎么办,如下?
trait G[+X]
class H[+X, Y] extends G[X]
class F extends G[Int]
def f[A<:G[X], X<:Int](g :A) = g
val h: H[Int, String] = ???
val g :F = ???
f(g)
f(h)
【问题讨论】:
标签: scala generics type-inference type-parameter higher-kinded-types