我想做这样的事情:
def parse[A: Numeric](str: String): A = {
if A =:= Int, str.toInt
if A =:= Float, str.toFloat
if A =:= BigInt, BigInt(str)
...
...
}
不幸的是,似乎fromString
特征中没有定义Numeric
。在Scala中实现这一目标的最惯用方法是什么?
答案 0 :(得分:1)
你所要求的通常不可能通过类型的可扩展性来实现;没有办法可以匹配Numeric
的所有可能实现,因为任何用户定义的类型都可以实现它。同样正因为如此,并不能保证每个Numeric[A]
都可以从字符串中解析。
有两种方法可以解决这个问题。一个是部分解决方案,您确保只使用表示整数文字的字符串,然后使用Int
' s fromString
来解析它和Numeric
' s {{ 1}}转换它。
另一种方法是在调用函数时传入实际的字符串解析函数。这可能有点像作弊,因为你的fromInt
方法不再有任何实际工作,但可以使用非常有用。
最直接的方法是添加一个(可能是隐式的)parse
参数(或者可能String -> A
以减少运行时错误)。实现这一目标的另一种方法是去the typeclass route again and implement something like a Readable
typeclass。然后你可以让你的功能如下:
String -> Option[A]
现在您只需要确保为您关注的所有def parse[A: Numeric: Readable](x: String): A = ...
实施Readable[A]
。