当我有混合类型Scala时输出奇怪的错误

时间:2018-01-03 15:30:08

标签: scala

Error:(21, 39) type mismatch;
 found   : Int
 required: _1 where type _1 >: Int with Float <: AnyVal
      varsMap(name) enqueue bar.intMap(name)

varsMap是一个带有字符串键的映射,值是队列,根据映射键,元素可以是Int或Float

所以varsMap(“int1”)是可变的.Queue [Int]

varsMap(“float1”)是可变的.Queue [Float]

bar.intMap(name)有一个整数值

我不明白这种表示法:必需:_1其中type _1&gt;:Int with Float&lt ;: AnyVal

有人可以解释一下这是什么意思吗?

添加代码部分:

 val integerSet = immutable.Set("int1","int2","int3")
  val floatSet = immutable.Set("float1","float2","float3","float4")
  val indicatorSet = immutable.Set("source", "ave", "range")
  //creating the map of data
  var varsMap = (integerSet map (t => t -> new mutable.Queue[Int]) toMap) ++ (floatSet map (t => t -> new mutable.Queue[Float]) toMap) ++ (indicatorSet map (t => t -> new mutable.Queue[Float]) toMap)

然后显示错误的部分

varsMap("int1") enqueue 5 //for example try to insert number 5 

因此它无法获得该值因为它需要一些奇怪的类型:_1其中type _1&gt;:Int with Float&lt ;: AnyVal

1 个答案:

答案 0 :(得分:2)

首先,我建议您逐步分析中间集合的类型,例如

val m1 = (integerSet map (t => t -> new mutable.Queue[Int]) toMap)
val m2 = (floatSet map (t => t -> new mutable.Queue[Float]) toMap)
val m3 = (indicatorSet map (t => t -> new mutable.Queue[Float]) toMap)

所以这些地图的类型分别是:

Map[String, Queue[Int]]
Map[String, Queue[Float]]
Map[String, Queue[Float]]

然后你试图合并所有这些地图:

var varsMap = m1 ++ m2 ++ m3

最后,您从要使用的地图中获取特定队列:

val vmInt = varsMap("int1")

,其类型为:Queue[_ >: Int with Float <: AnyVal{def getClass(): Class[_ >: Int with Float <: AnyVal]}]

本质上是说该队列用于存储类型的值,该类型是AnyVal的子类和混合类型的超类&#34; Int with Float&#34;输入即可。 可以通过下图更好地说明:

enter image description here

因此,在给定的上下文中,下划线是一种您想要放入队列的值。作为&#34; Int with Float&#34;是该类型的子类,您也可以将该类型的值放入队列中。但是对于Int和Float值不是这样,因为Int和Float不是_type的子类。这就是您遇到错误的原因。

您实际可以做的是构建 Int with Float 类型的值并将其放入队列中:

val i: Int with Float = 5.asInstanceOf[Int with Float]
varsMap("int1") enqueue i

但我不认为这是正确的,并且方便您使用此类型的值。我建议改为重新考虑你的逻辑,以便你排队到任何特定的地图m1,m2,m3。