Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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 什么';这有什么问题(编译器错误)?_Scala_Type Inference_Existential Type - Fatal编程技术网

Scala 什么';这有什么问题(编译器错误)?

Scala 什么';这有什么问题(编译器错误)?,scala,type-inference,existential-type,Scala,Type Inference,Existential Type,我很抱歉这样的非描述性标题,但我真的不知道如何更好地表达这一点 class Foo[T] Seq(new Foo[String], new Foo[Int]).groupBy(_ => 1).map { case (k, Seq(v)) => k -> v }.toMap <console>:12: error: Cannot prove that (Int, Foo[_146]) forSome { type _146 >: Int with String

我很抱歉这样的非描述性标题,但我真的不知道如何更好地表达这一点

class Foo[T]
Seq(new Foo[String], new Foo[Int]).groupBy(_ => 1).map { case (k, Seq(v)) => k -> v }.toMap
<console>:12: error: Cannot prove that (Int, Foo[_146]) forSome { type _146 >: Int with String } <:< (T, U).
class Foo[T]
Seq(newfoo[String],newfoo[Int]).groupBy(=>1).map{case(k,Seq(v))=>k->v}.toMap

:12:错误:无法证明(Int,Foo[_146])对于某些{type{u 146>:Int with String}没有差异的情况,您创建了一个有点“荒谬”的序列:

class Foo[T]
val in = Seq(new Foo[String], new Foo[Int]) // Seq[_ >: Int with String]]
Foo[String]
Foo[Int]
之间根本没有共同的润滑油。您可以将其指定为存在类型:

val in = Seq[Foo[_]](new Foo[String], new Foo[Int])
然后我们可以尝试继续:

val in = Seq[Foo[_]](new Foo[String], new Foo[Int])
val g  = in.groupBy(_ => 1)  // Map[Int, Seq[Foo[_]]]
// the next line would produce a match error, thus make it a `def`
def m  = g.map { case (k, Seq(v)) => k -> v } // Iterable[(Int, Foo[_])]
def p  = m.toMap  // cannot prove that (Int, Foo[_]) <:< (T, U)
好吧,Scalac不会为您推断存在类型


如果您认为这里有
Foo[Any]
,则需要添加方差注释:

class Foo[+T]
val in = Seq(new Foo[String], new Foo[Int]) // Seq[Foo[Any]]
def m = in.groupBy(_=>1).map {case (k,Seq(v)) => k->v}.toMap // Map[Int,Foo[Any]]

你想以什么类型结束?
Map[Int,Foo[\u]]
会很好。我不想要
Foo[Any]
,我想要一个存在类型
.toMap[Int,Foo[\u]]
有效,谢谢。。。这是我唯一没有尝试过的选项:)我仍然不明白为什么
.map
.mapValues
的工作方式不同(后者确实有效,我甚至不需要
.toMap
——这是多余的,因为
.map
.mapValues
的结果已经是一张地图)。还有,为什么
.grouBy
首先起作用?如果在
groupBy
之后键入已知的值,那么将值映射到seq的头不会使情况变得更糟,是吗?
class Foo[+T]
val in = Seq(new Foo[String], new Foo[Int]) // Seq[Foo[Any]]
def m = in.groupBy(_=>1).map {case (k,Seq(v)) => k->v}.toMap // Map[Int,Foo[Any]]