Generics is an feature that allows us to define placeholder datatypes for Classes, Methods, Interfaces, etc. which will be replaced by a specific datatype at compile time
It allows to write class or method that can work with any datatype (Code Reuse)
Generics can be declared at the Class Level or at the Method Level. A non generic class can contain generic methods
We can implement constraints on the generic datatype as well using the “where” keyword. This can be specified at the class or method level