2010-07-21 13 views
6

En mi propio código y en numerosas publicaciones de listas de correo, noté confusión debido a que no se infiere nada como el límite superior mínimo de otros dos tipos.¿En qué condiciones se infiere Nada deseable?

La respuesta puede ser obvio para usted *, pero yo soy vago, así que te pido *:

  • ¿En qué condiciones se inferir Nada de esta manera el resultado más deseable?

  • ¿Tendría sentido que el compilador arrojara un error en estos casos, o una advertencia a menos que sea anulado por algún tipo de anotación?

* Plural

Respuesta

2

Es imposible inferir Nothing como el límite superior mínimo de dos tipos a menos que esos dos tipos también sean ambos Nothing. Cuando infiere el límite superior mínimo de dos tipos, y esos dos tipos no tienen nada en común, obtendrá Any (en la mayoría de los casos, obtendrá AnyRef, porque solo obtendrá Any cuando un tipo de valor como Int o Long está involucrado.)

+0

Una respuesta correcta a mi pregunta poco clara, lo suficientemente buena por ahora. :) –

4

Nada es el subtipo de todo, lo que es en cierto modo la parte mostrador de cualquier, que es el supertipo de todo. No se puede instanciar nada, nunca mantendrá un objeto Nothing. Hay dos situaciones (yo sepa) que nada es realmente útil:

  • Una función que no vuelve nunca (en contraste con una función que no devuelve ningún valor útil , que utilizaría la unidad en su lugar), el cual ocurre para bucles infinitos, bloqueo infinito, lanzando siempre una excepción o saliendo de la aplicación
  • Como una forma de especificar el tipo de Contenedores vacíos, ej. Nada o nada. En Java, no puede tener un solo objeto Nil para una lista inmutable genérica sin casting u otros trucos: si desea crear una Lista de fechas, incluso el elemento vacío debe tener el tipo correcto, que debe ser un subtipo de Fecha. Como fecha y p. Entero no comparte un subtipo común en Java, no puede crear una instancia Nil sin trucos, a pesar de que su Nil ni siquiera tiene ningún valor. Ahora Scala tiene este subtipo común para todos los objetos, por lo que puede definir Nil como object Nil extends List[Nothing], y puede usarlo para iniciar cualquier Lista que desee.

A su segunda pregunta: Sí, eso sería útil. Supongo que ya hay un interruptor de compilación para activar estas advertencias, pero no estoy seguro.

+0

Gracias, pero estoy muy consciente de lo que nada es bueno para el aislamiento; Estoy tratando de averiguar cuándo es útil inferirlo mediante el algoritmo LUB. –

Cuestiones relacionadas