2016-01-24 5 views
1

У меня может быть простой глупый вопрос, как использовать Scala Map для хранения разных типов значений, например, я хочу, чтобы Карта сохраняла как строковые, так и двойные значения, я пробовал следующий код :Как хранить различные типы значений в scala

var yaraMap: Map[String, AnyRef] = Map() 
yaraMap+={"as"->10.0} 
yaraMap+={"bb"->'val'} 

Но это говорит о несоответствии типа, как я могу исправить это, пожалуйста, спасибо!

ответ

9

Определите вашу карту, как

val yaraMap: Map[String, Any] = Map() 

Any является общим супертипом Double и String.

следующее изображение демонстрирует, как связаны AnyVal и AnyRef. String является подтип AnyRef, Double является подтип AnyVal, их общий супертип: Any.

image source

+0

Thanks David, Why AnyRef и Object не в порядке, но Any please. – Jack

+2

потому что 'Double' не' AnyRef' его 'AnyVal' –

+0

Большое спасибо Дэвиду за красивую картинку :) – Jack

1

Ответ от David Frank велик. Вот небольшое усовершенствование, чтобы сделать код typafe (обратите внимание: Any и AnyRef позволят вам добавлять любые другие типы к карте без жалобы компилятора).

Если вы только хотите, чтобы ваши ценности, чтобы быть двойным или строку вы можете сделать это:

var yaraMap: Map[String, Either[Double, String]] = Map() 
yaraMap+={"as"->Left(10.0)} 
yaraMap+={"bb"->Right("val")} 

Возможно более многословным, но по крайней мере это будет перерыв, если вы пытаетесь добавить, скажем, или любой другой тип List() ,

yaraMap+={"as"->Left(34)} 
<console>:9: error: type mismatch; 
found : List[String] 
required: Double 
       yaraMap+={"as"->Left(List("a"))} 
+1

Отлично! Coooooool! – Jack

Смежные вопросы