Scala Map[String, Int] class 施放灾难
Scala Map[String, Int] class cast disaster
在单元测试中将一个 Map[String, Int]
断言给另一个我得到:
Map(bar -> 114, foo -> 5) did not equal Map("foo" -> 5, "bar" -> 114)
注意键不是在左边引号,而是在右边引号。
左图通过 Kafka 往返,Avro 序列化作为 GenericRecord 的一部分。右边是我这样搭建的测试夹具:
program_int_args = Map[String, Int]("foo" -> 5, "bar" -> 114)
一旦我从 Kafka 取回它,我就会像这样解码 Avro 消息:
val program_int_args_ =
record.get("program_int_args")
.asInstanceOf[java.util.Map[String, Integer]]
.asScala
.toMap[String, Integer]
.mapValues(Integer2int(_))
问题:
- 为什么从 GenericRecord 过来后没有引号?
- 为什么在构建的地图中存在引用?
- 我怎样才能使它们相等?
根据 Thomas Klager 的评论,我检查了键的 类,确实它们是不同的:
class org.apache.avro.util.Utf8 did not equal class java.lang.String
所以更新问题:
Utf8
类型如何成为 Map[String, Int]
中的键但不等于 String
中的相同数据?
我认为是因为类型擦除这两个转换
.asInstanceOf[java.util.Map[String, Integer]]
.toMap[String, Integer]
不要真正检查映射中键和值的类型。
你可以试试
val program_int_args_ =
record.get("program_int_args")
.asInstanceOf[java.util.Map[Object, Integer]]
.asScala
.toMap[Object, Integer]
.map { case (k, v) => (k.toString, Integer2int(v))}
相反,它将键转换为字符串。
在单元测试中将一个 Map[String, Int]
断言给另一个我得到:
Map(bar -> 114, foo -> 5) did not equal Map("foo" -> 5, "bar" -> 114)
注意键不是在左边引号,而是在右边引号。
左图通过 Kafka 往返,Avro 序列化作为 GenericRecord 的一部分。右边是我这样搭建的测试夹具:
program_int_args = Map[String, Int]("foo" -> 5, "bar" -> 114)
一旦我从 Kafka 取回它,我就会像这样解码 Avro 消息:
val program_int_args_ =
record.get("program_int_args")
.asInstanceOf[java.util.Map[String, Integer]]
.asScala
.toMap[String, Integer]
.mapValues(Integer2int(_))
问题:
- 为什么从 GenericRecord 过来后没有引号?
- 为什么在构建的地图中存在引用?
- 我怎样才能使它们相等?
根据 Thomas Klager 的评论,我检查了键的 类,确实它们是不同的:
class org.apache.avro.util.Utf8 did not equal class java.lang.String
所以更新问题:
Utf8
类型如何成为 Map[String, Int]
中的键但不等于 String
中的相同数据?
我认为是因为类型擦除这两个转换
.asInstanceOf[java.util.Map[String, Integer]]
.toMap[String, Integer]
不要真正检查映射中键和值的类型。
你可以试试
val program_int_args_ =
record.get("program_int_args")
.asInstanceOf[java.util.Map[Object, Integer]]
.asScala
.toMap[Object, Integer]
.map { case (k, v) => (k.toString, Integer2int(v))}
相反,它将键转换为字符串。