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]]