分散することなく、あなたはやや「無意味な」配列を作成します。そこだけではありませんFoo[String]
とFoo[Int]
間に共通LUB
class Foo[T]
val in = Seq(new Foo[String], new Foo[Int]) // Seq[_ >: Int with String]]
。その後、我々は継続しようとすることができ
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)
再び実存型が値型のための便利な推論を許可しないで、ここであなたを噛むあなたは実存タイプを割り当てることができます。あなたは再びそれを強制することができます。
def p = m.toMap[Int, Foo[_]] // Map[Int,Foo[_]]
私の知る限り、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]]
を? – Bergi
'Map [Int、Foo [_]]'は良いでしょう – Dima