Difference between Any, Unit and Nothing : Kotlin
We all know about three classes Any
, Unit
and Nothing
in Kotlin which have their own functionality and use cases but we usually confuse between the differences among them and when to use what.
Let try to understand what are these, when to use what and how these are different from one another.
This post was originally posted at https://agrawalsuneet.github.io/blogs/difference-between-any-unit-and-nothing-kotlin/ and reposted on Medium on 3rd Mar 2020.
Any
Any
is an open class and by default the superclass for all the classes, whether we define it explicitly or not. This is similar to the Object
class in Java which is the superclass for each and every class.
/**
* The root of the Kotlin class hierarchy. Every Kotlin class has [Any] as a superclass.
*/
public open class Any {
public open operator fun equals(other: Any?): Boolean
public open fun hashCode(): Int public open fun toString(): String
}
Any
has 3 functions
- equals
- hashCode
- toString
All three functions are well-known functions which can be overridden in any class.
equals
/**
* Indicates whether some other object is "equal to" this one. Implementations must fulfil the following
* requirements:
*
* * Reflexive: for any non-null value `x`, `x.equals(x)` should return true.
* * Symmetric: for any non-null values `x` and `y`, `x.equals(y)` should return true if and only if `y.equals(x)` returns true.
* * Transitive: for any non-null values `x`, `y`, and `z`, if `x.equals(y)` returns true and `y.equals(z)` returns true, then `x.equals(z)` should return true.
* * Consistent: for any non-null values `x` and `y`, multiple invocations of `x.equals(y)` consistently return true or consistently return false, provided no information used in `equals` comparisons on the objects is modified.
* * Never equal to null: for any non-null value `x`, `x.equals(null)` should return false.
*/public open operator fun equals(other: Any?): Boolean
equals
functions check if the object is equal to the object passed in parameter. There are different criteria on which equals
function checks the equality but we can override
this function in any class.
hashCode
/**
* Returns a hash code value for the object. The general contract of `hashCode` is:
*
* * Whenever it is invoked on the same object more than once, the `hashCode` method must consistently return the same integer, provided no information used in `equals` comparisons on the object is modified.
* * If two objects are equal according to the `equals()` method, then calling the `hashCode` method on each of the two objects must produce the same integer result.
*/
public open fun hashCode(): Int
hashCode
returns a unique integer
for each and every object of that class. This function is also open
and we can override
it according to our use case.
toString
/**
* Returns a string representation of the object.
*/
public open fun toString(): String
This is the most commonly overridden function which is used to represent the object in string form. This is again open
and we can override
it according to the use case.
We can even create an object of Any
class and use any of the above functions.
val any: Any = Any()
any.equals(Any())
any.hashCode()
any.toString()
Unit
Unit
class is an object
class which means it a singleton class having only one object.