向 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)
}
所以我想添加一个隐式方法,该方法将 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)
}