Tipos de Retorno legales en Java

Buenas tardes, en esta entrada de Java cubriremos 2 aspectos sobre los tipos de retorno:

  • Qué podemos declarar como tipo de retorno.
  • Que podemos retornar actualmente como valor.


  • Declaracion de tipo de retorno

    En esta sección miraremos lo que está permitido declarar como tipo de retorno, lo cual depende primariamente si estamos sustituyendo, sobrecargando o creando un nuevo método.

    Tipo de retorno en Métodos Sobrecargados (Overload)

    Recordamos que un método sobrecargado no es mas que una reutilización del nombre. El método sobrecargado es completamente diferente a otro método con el mismo nombre. Por lo que si heremos heredar un método pero sobrecargarlo en una subclase, no está sujeto a las restricciones de sustitución (override), lo cual significa que podemos declarar otro tipo de retorno que queramos. Lo que no podemos ahcer es cambiar SOLO el tipo de retorno. Para sobrecargar un método, recordemos, debemos cambiar la lista de argumentos. El siguiente código muestra un método sobrecargado:

    		public class Foo {
    			void go(){ }
    		}
    		
    		public class Bar extends Foo{
    			String go(int x){
    				return null;
    			}
    		}
    		

    Tomemos atención a que la version Bar del método usa un tipo de retorno diferente. Esto está perfectamente bien. Siempre que cambiemos la lista de argumentos, estaremos sobrecargando un método, por lo que el tipo de retorno no tiene porque coincidir con el de la versión de al superclase. Lo que NO está permitido es lo siguiente:

    		public class Foo {
    			void go(){ }
    		}
    		
    		public class Bar extends Foo{
    			String go(){	// No es legal, no se puede cambiar solo el tipo de retorno
    				return null;
    			}
    		}
    		

    Sustitución y Tipos de Retorno, y Retornos Covariante

    Cuando una subclase quiere cambiar la implementación de un método de un método heredado (y sustituido), la subclase debe definir un método que ajuste a la versión heredada exactamente. Vamos a ver un retorno covariante en acción:

    		class Alpha{
    			Alpha doStuff(char c){
    				return new Alpha();
    			}
    		}
    		
    		class Beta extends Alpha{
    			Beta doStuff (char c){	//Sustitucion legal en Java 1.5
    				return new Beta();
    			}
    		}
    		

    Como en Java 5, este código compilaría. Si quisieramos compilar este código con un compilador 1.4 tendríamos un error.

  • Retornando un Valor

    Tenemos que recordar solo 6 reglas para retornar un valor:

    1. Podemos retornar null en un método con una referencia a un objeto como tipo de retorno:

      				public Button doStuff(){
      					return null;
      				}
      				
    2. Un array es un tipo de retorno perfectamente legal.

      				public String[] go(){
      					return new String[] {"Fred", "barney", "Wilma"};
      				}
      				
    3. En un método con un tipo de retorno primitivo, podemos retornar cualquier valor o variable que pueda ser implícitamente convertida al tipo de retorno declarado.

      				public int foo(){
      					char c = 'c';
      					return c; // char es compatible con int
      				}	
      				
    4. En un método con un tipo de retorno primitivo, podemos retornar cualquier valor o variable a la que pueda hacerse cast al tipo de retorno declarado.

      				public int foo(){
      					float f = 32.5f;
      					return (int) f;
      				}
      				
    5. No debemos retornar nada de un método con un tipo de retorno void.

      				public void bar(){
      					return "This is it"; // No es legal!
      				}
      				
    6. En un método con una referencia a un objeto como tipo de retorno, podemos retornar cualquier tipo de objeto al que pueda hacerse cast de manera implícitaal tipo de retorno declarado.

      				public Animal getAnimal(){
      					return new Horse();
      				}
      				
      				public Object getObject(){
      					int[] nums = {1, 2, 3};
      					return nums;	// Retorna un array de int, lo cual es un objeto
      				}
      				
      				public interface Chewable{ }
      				public class Gum implements Chewable{ }
      				
      				public class TestChewable{
      					// Metodo con una interface como tipo de retorno
      					public Chewable getChewable(){
      						return new Gum(); // Retorna un aimplementación de la interface
      					}
      				}
      				

Hasta aquí un poco sobre los tipos de retorno que pueden existir en Java, y las reglas en caso de ser métodos que han sido sobrecargados (Overload) o sustituidos (Override).


Sin más, cualquier aporte o corrección es bienvenida!.

Saludos!!!