
En Java, cuando hacemos referencia a un tipo covariant nos referimos a un tipo de dato hijo del que nos referimos. Este término se suele usar cuando se habla del tipo de dato que se devuelve en un método que está sobrescribiendo a otro. Una de las reglas de la sobrescritura dicta que un método sobrescrito debe de tener un tipo de retorno igual o más restrictivo (covariant). Pero, ¿Qué es eso de más restrictivo? Veamos un ejemplo:
//Vivienda.java public class Automovil {} //Chalet.java public class AutomovilTerrestre extends Automovil { public Automovil crearAuto(){ return null; } } //Casa.java public class Coche extends AutomovilTerrestre { public AutomovilTerrestre crearAuto(){ return null; } } //Main.java public class Main extends Coche { public static void main(String[] args){ Main m = new Main(); Coche c = m.crearAuto(); } public Coche crearAuto(){} }
Aquí finalmente es la clase tipo Main (Hija de Coche, Nieta de AutomovilTerrestre, ..) la que ha devuelto un subtipo (Coche) ya que lo ha sobrescrito por una subclase de la misma.
Más información: Oracle.com
Java Básico: Tipos de retorno covariant