向 Scala 地图添加隐式 getAs() 方法

Adding an implicit getAs() method to Scala Maps

所以我想添加一个隐式方法,该方法将 return 通过检查键的类型来确定键的值。

import scala.reflect.ClassTag

object MyMap {
  implicit class FlexMap[A](map: Map[String, A]) {
    def getAs[B](key: String)(implicit ct: ClassTag[B]): Option[B] = map.get(key) match {
      case Some(value: ct.runtimeClass) => Some(value.asInstanceOf[B])
      case _ => None
    }
  }
}

但是当我尝试编译它时,我得到:

type runtimeClass is not a member of scala.reflect.ClassTag[B]

即使我使用了同样的错误:

case Some(value) if (value.isInstanceOf[ct.runtimeClass])

我不确定如何解决这个问题。有什么想法吗?

在 Scala 中,类型不是值,它们属于不同的类别,因此无法从方法返回类型。 .runtimeClass 事实上 returns 类型 Class 的值不能用于需要类型的地方。您可能需要的是:

object MyMap {
  implicit class FlexMap[A](map: Map[String, A]) {
    def getAs[B](key: String)(implicit ct: ClassTag[B]): Option[B] = map.get(key) match {
      case Some(value: B) => Some(value)
      case _ => None
    }
  }
}

另一种说法:

def getAs[B](key: String)(implicit ct: ClassTag[B]): Option[B] = 
  map.get(key) flatMap {
    case value: B => Some(value)
    case _        => None
  }

ClassTag 有一个 unapply 方法可以为您完成实际的转换工作,returns 有一个选项。

implicit class FlexMap[A](map: Map[String, A]){                                                        
  def getAs[B](key: String)(implicit ct: ClassTag[B]): Option[B] = 
    map.get(key).flatMap(ct.unapply)     
}