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
答案 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;输入即可。 可以通过下图更好地说明:
因此,在给定的上下文中,下划线是一种您想要放入队列的值。作为&#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。