理解できない scala の型システムの問題があります。この問題は、以下のスニペットで示されています。タイプAまたはAのサブタイプのキーを持つことができるクラスにマップメンバーを持つことができる正しいアプローチは何ですか? 2 番目のアプローチは正しいと思いますが、マップから要素を取得しようとするとエラーが発生します。これは存在型と関係がありますか?
sealed abstract class MyBaseType
case class Concrete1() extends MyBaseType
case class Concrete2() extends MyBaseType
case class DictVariant1(data: Map[MyBaseType, Double])
case class DictVariant2(data: Map[_ <: MyBaseType, Double])
object App {
def main(args: Array[String]) {
val d = List((Concrete1(), 3.5)).toMap
/* this fails with:
* type mismatch;
* found: scala.collection.immutable.Map[Concrete1,Double]
* required: Map[MyBaseType,Double]
* Note: Concrete1 <: MyBaseType, but trait Map is invariant in type A.
* You may wish to investigate a wildcard type such as `_ <: MyBaseType`.
* (SLS 3.2.10)
*
*/
val dv1 = DictVariant1(d)
dv1.data.get(d)
/* Works fine */
val dv2 = DictVariant2(d)
/* this fails with:
* type mismatch;
* found: d.type (with underlying type scala.collection.immutable.Map[Concrete1,Double])
* required: _$1
*
*/
dv2.data.get(Concrete1())
}
}