scala - textual - texto argumentativo actividades para el aula
Scala: ¿Por qué Seq.contains toma un argumento Any, en lugar de un argumento del tipo de secuencia? (3)
Entonces, por ejemplo, ¿por qué la List(1,2,3,4).contains("wtf")
incluso se compila? ¿No sería bueno si el compilador rechazó esto?
"contiene" se refiere fundamentalmente a las pruebas de igualdad, y la igualdad en Scala (como en Java antes) está desatada. El valor práctico de tener igualdad sin tipo es pequeño, pero no cero. Hay, por ejemplo, algunas ocasiones en las que tiene sentido que dos objetos de diferentes clases sean iguales entre sí. Por ejemplo, es posible que desee que un objeto de tipo RGBColor sea igual a un PantoneColor si define el mismo tono, o que un HashSet inmutable y un TreeSet inmutable sean iguales si contienen los mismos elementos. Dicho esto, la igualdad no tipificada también causa muchos dolores de cabeza, y el hecho de que el compilador pueda captar fácilmente esa List(1,2,3,4).contains("wtf")
tiene sentido pero no lo hará es uno de ellos. .
La mayoría de las herramientas de búsqueda de errores de Java incluyen pruebas para detectar la presencia de usos improbables de igualdad sin tipo. (Escribí las inspecciones para hacer esto en IntelliJ IDEA). No tengo dudas de que cuando las herramientas de búsqueda de errores de Scala se pongan en línea, estarán entre los primeros errores detectados.
Muchas respuestas interesantes, pero aquí está mi propia teoría: si contains
no recibió un Any
, entonces Seq
no podría ser co-variante.
Vea, por ejemplo, Set
, que no es co-variante y cuyos contains
toman una A
lugar de un Any
.
Las razones para ello se dejan como ejercicio para el lector. ;-) Pero aquí hay una pista:
scala> class Container[+A](elements: A*) {
| def contains(what: A): Boolean = elements exists (what ==)
| }
<console>:7: error: covariant type A occurs in contravariant position in type A of value what
def contains(what: A): Boolean = elements exists (what ==)
^
SeqLike.contains comprueba si un valor está presente al verificar un elemento en la secuencia que sea igual al valor (utilizando ==). == toma un Any, así que sospecho que esta es la razón.