转换映射中的值类型-Scala

转换映射中的值类型-Scala,scala,Scala,我正在尝试将Map的值类型从Any转换为Scala中的字符串 我有这样的代码 import scala.collection.generic.CanBuildFrom case class Name(FristName: String,LastName: String) object App29 extends App { val name = Name("mark","aden") val stringListBuilder = new CanBuildFrom[List

我正在尝试将Map的值类型从Any转换为Scala中的字符串

我有这样的代码

import scala.collection.generic.CanBuildFrom


case class Name(FristName: String,LastName: String)

object App29 extends App {


  val name = Name("mark","aden")


  val stringListBuilder = new CanBuildFrom[List[Any], String, List[String]] { def apply(from: List[Any]) = this.apply(); def apply() = List.newBuilder[String] }

  val result = name.getClass.getDeclaredFields.map(_.getName)
    .zip(name.productIterator.toList)(stringListBuilder).toMap


}
因此,我使用CanBuilderForm将返回类型从Map[String,Any]转换为Map[String,String],但我不明白它为什么会抛出类型不匹配错误

谢谢

编辑-1


我发现我可以使用name.productIterator.map(u.toString)将其转换为字符串,但我想知道为什么我的CanBuildFrom语法是错误的,以及如何错误的。

这不是
CanBuildFrom
的设计目的
CanBuildFrom
旨在简化新集合类型的实现。这意味着可以在trait
GenTraversableLike
上定义
map
等方法,并且仍然能够返回特定集合的类型,而不必在每个子类型(如
List
Vector
等)上覆盖它,因为它对特定集合使用了
CanBuildFrom
builder,因此可以一般地执行操作

以上述方式使用
CanBuildFrom
只会让任何阅读您的代码的人完全困惑,这根本不是惯用语,应该避免-如果我看到
CanBuildFrom
以这种方式使用,我永远不会通过代码审查,如果您没有准确地解释您试图实现的目标,并展示一个如何以另一种方式实现的示例,那么即使代码确实编译并工作,我也会花很长时间来了解代码在做什么。一般来说,如果您真的知道自己在做什么,您应该只使用
CanBuildFrom
实例,并且只在希望提供可重用功能的实用程序库和框架中使用,它几乎不应该出现在应用程序代码中。在我6年的Scala开发中,我从未需要实现自己的
CanBuildFrom
,而且我只编写过两次代码,实际使用
CanBuildFrom
实例执行某些操作


至于你的代码为什么不编译,
zip
需要一个
CanBuildFrom
,它的第二个参数是原始集合类型的元组,以及你要传递的集合类型,也就是说,你应该提供一个
CanBuildFrom[List[Any],(String,Any),List[(String,String)]]

这不是
可以构建的
的设计目的
CanBuildFrom
旨在简化新集合类型的实现。这意味着可以在trait
GenTraversableLike
上定义
map
等方法,并且仍然能够返回特定集合的类型,而不必在每个子类型(如
List
Vector
等)上覆盖它,因为它对特定集合使用了
CanBuildFrom
builder,因此可以一般地执行操作

以上述方式使用
CanBuildFrom
只会让任何阅读您的代码的人完全困惑,这根本不是惯用语,应该避免-如果我看到
CanBuildFrom
以这种方式使用,我永远不会通过代码审查,如果您没有准确地解释您试图实现的目标,并展示一个如何以另一种方式实现的示例,那么即使代码确实编译并工作,我也会花很长时间来了解代码在做什么。一般来说,如果您真的知道自己在做什么,您应该只使用
CanBuildFrom
实例,并且只在希望提供可重用功能的实用程序库和框架中使用,它几乎不应该出现在应用程序代码中。在我6年的Scala开发中,我从未需要实现自己的
CanBuildFrom
,而且我只编写过两次代码,实际使用
CanBuildFrom
实例执行某些操作

至于你的代码为什么不编译,
zip
需要一个
CanBuildFrom
,它的第二个参数是原始集合类型的元组,以及你要传递的集合类型,也就是说,你应该提供一个
CanBuildFrom[List[Any],(String,Any),List[(String,String)]]

您可能对此感兴趣。从本质上讲,Scala将不再在其正在进行的语言设计中使用
CanBuildFrom
,这可能会引起您的兴趣。本质上,Scala将不再在其正在进行的语言设计中使用
CanBuildFrom