Scala:用于转换字符串的通用函数

标签 scala generics type-inference

我有一个带有 getter 方法的 map 。键总是一个字符串,值是任何。
我想允许调用者使用如下方法

get[Int](k: String)
get[Boolean](k:String)

并在此方法中将字符串转换为用户指定的特定类型。我想到的直接解决方案是
def get[T](k: String): T = k.asInstanceOf[T]

这不起作用。然后我试过
def cast[T](x: String, classTag: ClassTag[T]): T = classTag match {
   case Int => x.toInt
   case Boolean => x.toBoolean
   ...
}  

这不编译。我不确定这是否可能。任何想法或我需要编写我想要的所有方法?例如
def getInt(k: String): Int
def getBoolean(k: String): Boolean
...

最佳答案

这是 Scala 中广泛使用的 typeclass 模式的经典用例。我假设您有一个自定义实现 Mapget方法。

trait Converter[T]{        // typeclass
  def convert(t:String):T
}

implicit object ToIntConverter extends  Converter[Int] {
  def convert(t:String):Int = t.toInt
}


implicit object ToBooleanConverter extends  Converter[Boolean] {
  def convert(t:String):Boolean = t.toBoolean
}

//       vvv approach bellow works starting from scala 2.12 vvv
//
// implicit val ToBooleanConverter: Converter[Boolean] = s => s.toBoolean 
// implicit val ToIntConverter : Converter[Int]  = s => s.toInt 


def get[T](k:String)(implicit cv: Converter[T]):T= cv.convert(k)


println(get[Int]("1"))
println(get[Boolean]("true"))

关于Scala:用于转换字符串的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53784341/

相关文章:

Java var 和推理类型歧义

scala - 将scala中生成的数据写入文本文件

scala - 简化大规模匹配案例 - Scala

scala - scala 中的 void 函数等效吗?

c# - Generic Get 方法不包括 FK 的?

java - 推断嵌套静态泛型函数的泛型类型

haskell - 理解(,)<$>长度<*>头部的类型

json - 如何在 Play Framework 中的 Json 读取中添加自定义验证错误

java - 在泛型类中实现 compareTo() 方法

java - 在 Java 中,为什么在内部类上使用泛型不起作用?