【发布时间】:2011-02-20 12:13:28
【问题描述】:
这在我的项目中违反了类型安全,因此我正在寻找一种方法来禁用它。似乎如果一个函数采用 AnyRef(或 java.lang.Object),您可以使用任何参数组合调用该函数,Scala 会将参数合并为一个 Tuple 对象并调用该函数。
在我的情况下,该函数不需要元组,并且在运行时失败。我希望这种情况会在编译时被发现。
object WhyTuple {
def main(args: Array[String]): Unit = {
fooIt("foo", "bar")
}
def fooIt(o: AnyRef) {
println(o.toString)
}
}
输出:
(foo,bar)
【问题讨论】:
-
如果一个函数将
AnyRef作为参数,它期望参数是任何东西,不是吗?我的意思是即使 scala 没有自动将参数打包到一个元组中,你仍然可以显式地传递一个元组,这当然是完全类型安全的,因为你的函数可以接受任何东西,而元组是任何东西。如果您的函数只能处理某些类型的参数,则应将其声明为仅接受这些类型的参数或动态检查参数类型。 -
那么它期望什么?您可能必须将其分解为各个专家。当然,如果您期望除了 Tuple 之外的任何东西,那也无济于事。
-
很公平......但通常合同(在其他编程语言中)是如果一个函数需要 1 个参数并用 2 个参数调用,那么编译将失败。
-
隐式可以这样做吗?
-
你能避免使用 AnyRef 吗?您正在将 Scala 类型系统扔出窗外 :) 它可能会带来一些性能损失,但是您是否考虑过使用结构类型?
标签: syntax scala tuples tuple-packing