Scala通用函数假设类型

时间:2014-02-04 01:35:36

标签: scala

尝试定义通用方法def f[T] (x:T) = x + 1时,Scala会给出以下错误

<console>:8: error: type mismatch;
found   : Int(1)
required: String
   def f[T] (x:T) = x + 1
                        ^

问题是为什么Scala假设它应该是String

如果我们想要一个可以+1IntCharString的函数,该怎么办?我知道我可以执行类似下面的操作,但它只适用于IntChar

def f[T <% Int](x:T) = x + 1

那么这个错误的原因是什么,以及如何以通用方式处理它。

2 个答案:

答案 0 :(得分:3)

  

问题是为什么Scala假设它应该是一个String?

我不能保证这种分析,但似乎Scala正在将Predef.any2stringadd()隐式转换应用于x,试图将其转换为支持+运算符的内容

这是一个将编译的变体,它演示了隐式转换:

scala> def f(x:Any) = { x + "1" }
f: (x: Any)String

scala> f("foo")
res3: String = foo1

scala> f(123)
res0: String = 1231

scala> f(classOf[String])
res2: String = class java.lang.String1
  

如果我们想要一个可以对Int,Char和String做+1的函数怎么办。

为这些值中的任何一个添加1是什么意思?

如果您只想调用+运算符,则需要使用match运算符根据实际类型选择不同的行为。这是因为,虽然名称+用于两者,但字符串和数字之间没有共同的行为。

另一方面,也许您想要处理可以作为字符串或数值提供的数字(在这种情况下,为什么Char?)。为了实现这一目标,您需要一个将Any转换为数字的隐式函数。

scala> implicit def any2int(x:Any) : Int = { x.toString.toInt }
warning: there were 1 feature warning(s); re-run with -feature for details
any2int: (x: Any)Int

scala> def f(x:Any) : Int = { x + 1 }
f: (x: Any)Int

scala> f(123)
res0: Int = 124

scala> f("123")
res1: Int = 124

答案 1 :(得分:0)

函数的返回类型将始终为Int,因为我认为应该是编译器选择Int而不是String。