Esta es una violación problemática de la seguridad de tipo en mi proyecto, por lo que estoy buscando una forma de desactivarla. Parece que si una función toma un AnyRef (o un java.lang.Object), puede llamar a la función con cualquier combinación de parámetros, y Scala fusionará los parámetros en un objeto Tuple e invocará la función.Scala fusiona los parámetros de llamadas a múltiples funciones en un Tuple. ¿Se puede deshabilitar?
En mi caso, la función no espera un Tuple y falla en tiempo de ejecución. Esperaría que esta situación fuera atrapada en tiempo de compilación.
object WhyTuple {
def main(args: Array[String]): Unit = {
fooIt("foo", "bar")
}
def fooIt(o: AnyRef) {
println(o.toString)
}
}
de salida:
(foo,bar)
Bueno, si una función toma un 'AnyRef' como argumento, espera que el argumento sea cualquier cosa, ¿no? Quiero decir, incluso si scala no empaqueta automáticamente los argumentos en una tupla, aún sería capaz de pasar una tupla explícitamente, lo cual es perfectamente seguro para los tipos, porque su función toma cualquier cosa y las tuplas son cualquier cosa. Si su función solo puede manejar ciertos tipos de argumentos, debe declararse que solo tome estos tipos de argumentos o verificar dinámicamente el tipo de argumento. – sepp2k
Entonces, ¿qué espera? Es posible que deba dividirlo en varios especialistas. Por supuesto, si estás esperando algo más que Tuple, eso no sería de ayuda. – sblundy
Bastante justo ... pero generalmente el contrato (en otros lenguajes de programación) es si una función espera 1 parámetro y se llama con 2, entonces la compilación fallará. –