泛型类型和它的Scala类型推断';s类型参数-为什么';这不管用吗?
如果我要说出scala最烦人的一件事,那就是以下代码:泛型类型和它的Scala类型推断';s类型参数-为什么';这不管用吗?,scala,generics,type-inference,type-parameter,higher-kinded-types,Scala,Generics,Type Inference,Type Parameter,Higher Kinded Types,如果我要说出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) trait G[+T] H类[+T]扩展了G[T] def f[A如果你把A作为一个类型参数A[\u],我想你可以让Scala编译器同意你的意见,而不是只把所有的都设为“无”: def f[A[_] <: G[_], X <: Int](g:
trait G[+T]
class H[+T] extends G[T]
def f[A<:G[X], X<:Int](g :A)
val g :H[Int]
f(g)
trait G[+T]
H类[+T]扩展了G[T]
def f[A如果你把A
作为一个类型参数A[\u]
,我想你可以让Scala编译器同意你的意见,而不是只把所有的都设为“无”
:
def f[A[_] <: G[_], X <: Int](g: A[X])
谢谢,这当然很有帮助,而且看起来它解决了这里的问题。但是,如果H是另一种类型,它将不会有帮助-使用更多的类型参数或不使用,实例化G的参数。或者如果H在其参数上引入了边界。所以我仍然感兴趣的是,是否有一个原因说明上述方法不起作用。您必须给出另一个示例不起作用的是,我很确定你通常可以让编译器同意你的观点。上面发生的是编译器在从g:A
中提取类型时遇到问题。它可以判断A
是H[Int]
但是你没有指定X
,所以即使你说A@Turin,它也会吐出来。我提供的方法适用于你添加的新案例。现在,谢谢!我想有一个大的重构在等着我,我会看看它是否解决了我所有的实际问题。
def f[A[_] <: G[_], X <: Int](g: A[X])
trait G[+X]
class H[+X, Y] extends G[X]
class F extends G[Int]
class I extends G[String]
def f[A[_] <: G[_], X <: Int](g: A[X]) = g
val h: H[Int, String] = new H[Int, String]
val g: F = new F
val i:I = new I
f(g) //works
f(h) //works
f(i) // should fail and does fail