Scala中Map的扩展方法

Scala中Map的扩展方法,scala,generics,extension-methods,Scala,Generics,Extension Methods,我是Scala世界的新手! 我正试图开发一些助手,使我的生活更容易围绕Scala代码。 例如,我正在努力让它工作的一部分如下- object Helpers{ implicit class MapExt(val self: Map[String, Any]) extends AnyVal { // gets a map value for specified key casting as required type def GetValueAs[T](key: Str

我是Scala世界的新手! 我正试图开发一些助手,使我的生活更容易围绕Scala代码。 例如,我正在努力让它工作的一部分如下-

object Helpers{
  implicit class MapExt(val self: Map[String, Any]) extends AnyVal {
      // gets a map value for specified key casting as required type
      def GetValueAs[T](key: String): T = self(key).asInstanceOf[T];
  }
}
这段代码背后的逻辑是,我有一个
字符串
任何
映射,我需要在运行时强制转换值。我在这里试图实现的并不重要,但重要的是我们如何在Scala中做到这一点。我怎样才能拥有一个扩展方法来处理特定类型的泛型类型(在本例中是
Map[String,Any]
),而该方法本身就是泛型类型。如果我试图将上面的代码用作-

myMap.GetValueAs[Date]("start_date")
错误:值GetValueAs不是scala.collection.immutable.Map[String,Any]的成员

有人能帮我做个简单的例子吗。这将是一个很大的帮助,我很感激


谢谢

您需要将扩展方法引入范围,即通过导入它们:

object Helpers {
  implicit class MapExt(val self: Map[String, Any]) extends AnyVal {
    // gets a map value for specified key casting as required type
    def getValueAs[A](key: String): A = self(key).asInstanceOf[A]
  }
}

import Helpers._  // !
Map("foo" -> 2, "bar" -> 3.45).getValueAs[Int]("foo")  // works

它对我有用。您是否将隐式类引入范围。也就是说,在调用
myMap.GetValueAs
之前,您是否导入了帮助程序?这应该是所有需要的。为什么您有
扩展AnyVal
?在这种情况下,这是否有意义,即您是否会享受它的好处?在Scala中,我们不将方法名称大写。使用
getValueAs
代替,因为我在同一个范围内,我以为它会自动完成,但显然它没有:(谢谢你的帮助。)help@KevinMeredith基于Scala文档,如果不这样做,它将在运行时为此创建一个对象;否则,它没有任何其他好处!给定:
lub(List)(typeOf[Map[String,String]],typeOf[AnyVal])===Any
扩展AnyVal
不是毫无意义吗?@KevinMeredith
扩展AnyVal
与对等类型(
Map
)无关。它只是意味着扩展方法是静态调度的,而不是创建
MapExt
的实际实例(因此,假设它要快一点)。这是在Scala中调用的。@KevinMeredith“根据文档”,文档中是否有特定的行具有误导性?生成的代码包括对琐碎的合成
MapExt
方法的调用,这可能会让人困惑,但不会分配。此外,
Int
结果也必须取消绑定。