尝试定义通用方法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
?
如果我们想要一个可以+1
到Int
,Char
和String
的函数,该怎么办?我知道我可以执行类似下面的操作,但它只适用于Int
和Char
。
def f[T <% Int](x:T) = x + 1
那么这个错误的原因是什么,以及如何以通用方式处理它。
答案 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。