让我直接讨论我在使用类型边界时遇到的问题。
让我们考虑以下内容......我创建了一个这样的函数'foo'
def foo[A,B](x:A,y:B):(A,B)=(x,y)
我在 scala 工作表中调用了 foo ,比如
foo("Mars",2400)
我得到了类似的结果
res0: (String, Int) = (Mars,2400)
注意 Mars 和 2400 的推断类型
现在我想强制函数 'foo' 接受整数或浮点数或双精度数(任何类型是 AnyVal 的子类型)。
为了强制执行,我编写了类似的代码
def fooNew[A<:B,B](x:A,y:B):(A,B)=(x,y)
从前面的代码中推断出的类型是 (String,Int) 并且当我调用 fooNew 时
fooNew("Saturn",2400)
我很惊讶地看到编译器确实让我的代码通过并且没有引发错误,而是给出了类似的输出
res0: (String, Any) = (Saturn,2400)
现在,所需的执行方式在这里不起作用。如果我做了这样的事情
def fooNew[A<:B,B<:AnyVal](x:A,y:B):(A,B)=(x,y)
编译器肯定会为我引发错误,而且确实如此!
Error:(2, 2) inferred type arguments [String,Any] do not conform to method fooNew's type parameter bounds [A <: B,B <: AnyVal]
fooNew("Saturn",2400);}
我想问,为什么编译器没有将类型设为 Int 而是推断出类型 Any 并让我的代码通过类型检查?
我是否总是需要将第二种类型强制为AnyVal的子类型,而不是让编译器为我推断它?或者它是编译器中的错误。
如果您发现我的问题具有误导性或不符合您的期望,请寻求原谅。
目前我正在使用 scala-library 2.11.8
谢谢