¿Pueden los métodos anulados diferir en el tipo de devolución?

¿Pueden los métodos anulados tener diferentes tipos de devolución ?

Java admite * tipos de retorno covariantes para métodos reemplazados. Esto significa que un método anulado puede tener un tipo de devolución más específico. Es decir, siempre que el nuevo tipo de devolución sea asignable al tipo de devolución del método que está anulando, está permitido.

Por ejemplo:

 class ShapeBuilder { ... public Shape build() { .... } class CircleBuilder extends ShapeBuilder{ ... @Override public Circle build() { .... } 

Esto se especifica en la sección 8.4.5 de la Especificación del lenguaje Java :

Los tipos de devolución pueden variar entre los métodos que se anulan entre sí si los tipos de devolución son tipos de referencia. La noción de la capacidad de sustitución del tipo de retorno admite retornos covariantes, es decir, la especialización del tipo de retorno a un subtipo.

Una statement de método d1 con retorno tipo R1 es reemplazable por tipo de retorno para otro método d2 con retorno tipo R2, si y solo si se cumplen las siguientes condiciones:

  • Si R1 es nulo, R2 es nulo.

  • Si R1 es un tipo primitivo, entonces R2 es idéntico a R1.

  • Si R1 es un tipo de referencia, entonces:

    • R1 es un subtipo de R2 o R1 se puede convertir a un subtipo de R2 por conversión no verificada (§5.1.9), o

    • R1 = | R2 |

(“| R2 |” se refiere a la eliminación de R2, como se define en §4.6 de JLS ).


* Antes de Java 5, Java tenía tipos de devolución invariables , lo que significaba que el tipo de devolución de una anulación de método necesaria para coincidir exactamente con el método que se anula.

Sí, si devuelven un subtipo. Aquí hay un ejemplo:

 package com.sandbox; public class Sandbox { private static class Parent { public ParentReturnType run() { return new ParentReturnType(); } } private static class ParentReturnType { } private static class Child extends Parent { @Override public ChildReturnType run() { return new ChildReturnType(); } } private static class ChildReturnType extends ParentReturnType { } } 

Este código se comstack y ejecuta.

Sí, puede diferir, pero tienen algunas limitaciones.

Antes de Java 5.0, cuando anula un método, tanto los parámetros como el tipo de retorno deben coincidir exactamente. En Java 5.0, introduce una nueva instalación llamada tipo de retorno covariante. Puede anular un método con la misma firma pero devuelve una subclase del objeto devuelto. En otras palabras, un método en una subclase puede devolver un objeto cuyo tipo es una subclase del tipo devuelto por el método con la misma firma en la superclase.

En general, sí, el tipo de devolución del método de anulación puede ser diferente. Pero no es sencillo, hay algunos casos involucrados en esto.

Caso 1: si el tipo de devolución es tipo de datos primitivos o nulo.

Salida: si el tipo de devolución es vacío o primitivo, entonces el tipo de datos del método de clase padre y el método de anulación deben ser iguales. por ejemplo, si el tipo de retorno es int, float, string, entonces debería ser el mismo

Caso 2: si el tipo de devolución es un tipo de datos derivado:

Salida: si el tipo de devolución del método de la clase padre es de tipo derivado, entonces el tipo de devolución del método de anulación es el mismo tipo de datos derivado de la subclase para el tipo de datos derivado. por ejemplo, supongamos que tengo una clase A B es una subclase a A C es la subclase a B D es la subclase a C, entonces si la superclase está devolviendo el tipo A, entonces el método de anulación es la subclase puede devolver A, B, C o tipo D, es decir, sus subtipos. Esto también se llama covariencia.

sí Es posible … el tipo de devolución solo puede ser diferente si el tipo de devolución del método de clase primaria es
un tipo estupendo de tipo de retorno de método de clase infantil …
medio

  class ParentClass { public Circle() method1() { return new Cirlce(); } } class ChildClass extends ParentClass { public Square method1() { return new Square(); } } Class Cirlce { } class Square extends Circle { } --- 

Si este es el tipo de retorno entonces diferente se puede permitir …

El tipo de devolución debe ser el mismo que, o un subtipo de, el tipo de devolución declarado en el método reemplazado original en la superclase.

Tipos de anulación y devolución, y retornos covariantes
la subclase debe definir un método que coincida exactamente con la versión heredada. O bien, a partir de Java 5, puede cambiar el tipo de devolución en el

Código de muestra

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

A partir de Java 5, este código se comstackrá. Si tuviera que intentar comstackr este código con un comstackdor de 1.4 dirá intentar usar el tipo de devolución incompatible – sandeep1987 hace 1 minuto

SÍ, puede ser posible

 class base { base show(){ System.out.println("base class"); return new base(); } } class sub extends base{ sub show(){ System.out.println("sub class"); return new sub(); } } class inheritance{ public static void main(String []args) { sub obj=new sub(); obj.show(); } } 

Las otras respuestas son todas correctas, pero sorprendentemente todas dejan de lado el aspecto teórico aquí: los tipos de retorno pueden ser diferentes, pero solo pueden restringir el tipo utilizado en la súper clase debido al Principio de Sustitución de Liskov .

Es súper simple: cuando tienes un código de “cliente” que llama a algún método:

 int foo = someBar.bar(); 

entonces lo anterior tiene que funcionar (y devolver algo que sea un int sin importar qué implementación de bar() se invoque).

Significado: si hay una subclase de barra que anula la bar() entonces todavía tiene que devolver algo que no rompa el “código de llamada”.

En otras palabras: suponga que se supone que la bar() base bar() devuelve int. Entonces, una subclase podría volverse short , pero no long porque las personas que llamen estarán bien lidiando con un valor short , pero no long .