2012-04-13 32 views
6

El siguiente código utiliza el concepto de anulación de método en Java.Tipo de retorno covariante en Java

package pkg; 

import java.util.ArrayList; 
import java.util.List; 

abstract class SuperClass 
{ 
    abstract public List<String>getList(); 
} 

final class SubClass extends SuperClass 
{ 
    private List<String>list=null; 

    @Override 
    public ArrayList<String> getList() 
    { 
     list=new ArrayList<String>(); 
     list.add("A"); 
     list.add("B"); 
     return (ArrayList<String>) list; 
    } 
} 

final public class Main 
{ 
    public static void main(String[] args) 
    { 
     SuperClass s=new SubClass(); 
     List<String>list=s.getList(); 

     for(String str:list) 
     { 
      System.out.println(str); 
     } 
    } 
} 

Por convención, el método predominante utiliza la misma firma (con tipo de retorno) tanto en super clase y subclase. En el código anterior, el tipo de devolución del método getList() en el SuperClass es List y en su subclase el tipo de devolución es ArrayList. ¿Cómo funciona el método de anulación aquí?

Por cierto, es obvio que ArrayList es una implementación de la interfaz List pero ¿Cómo trata el compilador el tipo de retorno aquí mientras reemplazando el método getList()?

Debo creer algo como esto ... El tipo de devolución del método reemplazado puede ser un subtipo del tipo de devolución del método reemplazado.

+0

No parece haber ninguna buena razón para declarar '' SubClass.list' como list' (en lugar de un 'ArrayList'). –

+0

@ MichaelBrewer-Davis - Podría mejorar las cosas si usa 'SubClass' directamente en lugar de tratarlo como' SuperClass'. –

+0

@Brendan - Estaba hablando de que la variable miembro (privada) es demasiado general, no el método demasiado específico. La covarianza en el método es sol y mariposas. –

Respuesta

19

Sí.

En early java no era el caso, pero se modificó en Java 5.0.

No puede tener dos métodos en la misma clase con firmas que solo difieren por tipo de devolución. Hasta el lanzamiento de J2SE 5.0, también era cierto que una clase no podía anular el tipo de retorno de los métodos que hereda de una superclase. En este consejo aprenderá acerca de una nueva característica en J2SE 5.0 que permite tipos de retorno covariantes. Lo que esto significa es que 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. Esta función elimina la necesidad de una verificación y un fundido de tipos excesivos.

El origen de esta información ya no está disponible en las redes.

+0

El enlace está muerto. – Ghos3t

3

Sí, eso es correcto. Como ArrayList es una lista, puede devolver una ArrayList cuando el método original devolvió una lista.

4

En la programación orientada a objetos, un tipo de retorno covariante de un método es uno que se puede reemplazar por un tipo "más angosto" cuando el método se anula en una subclase. Un lenguaje notable en el cual este es un paradigma bastante común es C++. tipos de retorno covariantes han sido (parcialmente) permitido en el lenguaje Java desde el lanzamiento de JDK5.0, por lo que el siguiente ejemplo no compilar en una versión anterior:

// Classes used as return types: 

class A { 
} 

class B extends A { 
} 

// "Class B is more narrow than class A" 
// Classes demonstrating method overriding: 

class C { 
    A getFoo() { 
     return new A(); 
    } 
} 

class D extends C { 
    B getFoo() { 
     return new B(); 
    } 
} 

Más específicamente, covariante (ancho para más estrecho) o contravariante (de estrecho a más ancho) tipo de devolución se refiere a una situación en la que el tipo de devolución del método de sustitución se cambia a un tipo relacionado (pero diferente de) el tipo de devolución del método reemplazado original.

La relación entre los dos tipos de retorno covariantes suele ser la que permite la sustitución de un tipo con el otro, siguiendo el principio de sustitución Liskov.

Esto generalmente implica que los tipos de devolución de los métodos de anulación serán subtipos del tipo de devolución del método reemplazado. El ejemplo anterior ilustra específicamente tal caso. Si no se permite la sustitución, el tipo de devolución es invariable y causa un error de compilación.

Referencia: https://en.wikipedia.org/wiki/Covariant_return_type

+0

https://en.wikipedia.org/wiki/Covariant_return_type –

Cuestiones relacionadas