Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
泛型类型和它的Scala类型推断';s类型参数-为什么';这不管用吗?_Scala_Generics_Type Inference_Type Parameter_Higher Kinded Types - Fatal编程技术网

泛型类型和它的Scala类型推断';s类型参数-为什么';这不管用吗?

泛型类型和它的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:

如果我要说出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: 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