2014-09-12 3 views
0

Может кто-то, может быть, объясните мне, почему я получаю ошибку компиляции ниже, и лучший способ, чтобы сделать этот тип преобразованияПреобразование набора параметризованных типов на карту

Благодарности Des

case class A[T](i: Int, x: T) 
val set: Set[A[_]] = Set(A(1, 'x'), A(2, 3)) 
val map: Map[Int, A[_]] = set.map(a => a.i -> a) 

type mismatch; found : scala.collection.immutable.Set[(Int, A[_$19]) forSome { type _$19 }] required: Map[Int,A[_]] 

ответ

2

Есть несколько вещей здесь, во-первых, я полагаю, что A - это класс case (иначе вам нужно будет использовать ключевое слово new), во-вторых, ваша карта возвращает Set кортежей (не Map), в-третьих, вы возвращаете A[_] на карте , но a.x возвращение S Any, не A:

scala> case class A[T](i: Int, x: T) 
defined class A 

scala> val set: Set[A[_]] = Set(A(1, 'x'), A(2, 3)) 
set: Set[A[_]] = Set(A(1,x), A(2,3)) 

соответствовать типу подписи вы можете использовать toMap и изменить Map[Int, A[_]] к Map[Int, _]

scala> val map: Map[Int, _] = set.map(a => a.i -> a.x).toMap 
map: Map[Int, _] = Map(1 -> x, 2 -> 3) 

Если вы хотите сохранить оригинальную подпись (Map[Int, A[_]]) вам нужно вернуть A в кортеж:

scala> val map: Map[Int, A[_]] = set.map(a => a.i -> a).toMap 
map: Map[Int,A[_]] = Map(1 -> A(1,x), 2 -> A(2,3)) 
Смежные вопросы