scala.Some无法强制转换为scala.collection.immutable.Map异常

时间:2018-06-19 06:26:09

标签: scala scala-collections

我是斯卡拉的新手,

val data = Map("test" -> data1, 
               "cat" -> None, 
               "myList" -> Map("test2" -> data2, "test3" -> data3))

val output = data.map(x => 
      if (x._2.isInstanceOf[Map[String, Any]]) (x._1 -> Some(x._2)) 
      else x)

Map(test -> data1, 
    cat -> None, 
    myList -> Some(Map(test2 -> data2, test3 -> data3)))

val valueToFieldMapping = output(fieldName).get.asInstanceOf[Map[String, String]]

我正在

java.lang.ClassCastException: scala.Some cannot be cast to scala.collection.immutable.Map
如果有人对此有所了解,请帮助我。感谢

2 个答案:

答案 0 :(得分:1)

首先,让我们使用>>> import matplotlib.pyplot as plt >>> g = sns.FacetGrid(tips, col="time", row="smoker") >>> g = g.map(plt.hist, "total_bill") 清除output的定义:

mapValues

然后这样做

val output = data.mapValues(x =>
  if (x.isInstanceOf[Map[String, Any]]) Some(x)
  else x)

在创建val valueToFieldMapping = output(fieldName).asInstanceOf[Option[Map[String, String]]].get 时,您无法在get上调用Some,因为编译不知道它是output

说了这么多,评论是正确的,说使用OptionAny真的很难看,所以你需要找到一种更好的方式来表达你想做的事情。至少,使用asInstanceOf而不是match,以便在对象不是您认为的情况下实现错误情况。

答案 1 :(得分:0)

问题在于你在Object的实例上没有.get属性。 如果要使用.get方法,则不需要.get然后执行output.get(fieldName)

using (var conn = new NpgsqlConnection(_connectionString))
{
         conn.Open();
          using (var cmd = conn.CreateCommand())
          {
               cmd.CommandText = "CALL MyInsert('4','5','2013-04-04')";
               cmd.ExecuteNonQuery();
          }
         conn.Close();
}

val valueToFieldMapping = output(fieldName).get.asInstanceOf[Map[String, String]] 为您提供了output.get(fieldName),并且您正在尝试将对象转换为Option[Object]的实例

没有从Option到map的隐式转换,这就是你得到错误的原因:

Map[String, String]

或者你可以这样做:

java.lang.ClassCastException: scala.Some cannot be cast to scala.collection.immutable.Map