Que diferencia tiene Unit y Nothing en Kotlin o en Scala?? Dado que kotlin se ha "inspirado" en muchas cosas de Scala. Por lo tanto creo que en este caso los 2 lenguajes son iguales. (En realidad no estoy tan seguro, comenten si tienen otra información)
Antes de hablar de diferencias, veamos similitudes :
Unit: Unit en Kotlin o Scala corresponde al void en Java y de C. Al igual que void, Unit es el tipo de retorno de cualquier función que no devuelva ningún valor significativo, y es opcional mencionar Unit como tipo de retorno. Pero a diferencia de void, Unit es una clase real (en kotlin) o object (en Scala) con una sola instancia.
Nothing: Nothing es un tipo en Kotlin que represente "un valor que nunca existe", eso significa simplemente "ningún valor en absoluto".
Nothing se puede usar como el tipo de retorno de una función que nunca devuelve la ejecución del código, como, en bucle para siempre o siempre arroja Exception. Java no tiene nada similar al tipo Nothing.
Veamos unos ejemplos donde debemos utilizar Nothing como tipo de retorno.
Supongamos que hay una función reportError() que siempre lanza una RuntimeException. En una aplicación real, este reportError() puede agregar algunos registros útiles adicionales antes de lanzar la excepción o arroja diferentes excepciones basadas en diferentes condiciones.
En java se implementaría :
throw new RuntimeException();
}
En Kotlin :
fun reportError(): Nothing {
throw RuntimeException()
}
En Scala :
def reportError(): Nothing {
throw RuntimeException()
}
Como vemos Nothing debe ser escrito explícitamente como el tipo de retorno; de lo contrario, el tipo de retorno seguirá siendo Unit.
¿Qué pasará si colocamos por error alguna linea de código después de llamar a este método reportError ()?
// Java
int i = 0;
void exampleOne() {
reportError(); // throws RuntimeException
i = 1; // This is unreachable code. But there is no warning.
}
En java no pasaría nada, pero pero en kotlin nos avisaría :
// Kotlin
var i = 0;
fun exampleOne() {
reportError(); // throws RuntimeException
i = 1; // We will get an 'Unreachable code' warning here.
}
En Kotlin tendríamos un warning.
Otra cuestión importante es que Nothing implementa o se puede hacer pasar por diferentes tipos, lo que permite que hagamos lo siguiente :
/** `???` can be used for marking methods that remain to be implemented.
* @throws NotImplementedError
*/
def ??? : Nothing = throw new NotImplementedError
Y luego utilizar ??? para marcar una función que nos falta implementar.
/**
* Filtra los elementos pares
*/
def filtrarPares(xs: List[Int]): List[Int] = ???
Y tiene más usos Nothing por ejemplo Nil que es la lista vacia es de tipo List[Nothing] dado que este tipo puede hacerse pasar por otros tipos.
Ojo que hay algunas diferencias entre Scala y Kotlin más que nada en los nulleables de kotlin pero la idea general es esta.
Y creo que estamos, si me olvide de algo, para eso están los comentarios!