2011-01-07 12 views
5

Pasé bastante tiempo con Google para buscar información sobre este tema, pero los resultados relacionados tanto con las enumeraciones de Java como con los tipos de retorno covariantes eran prácticamente inexistentes.Los tipos de retorno covariantes de Java no funcionan para anular los métodos de una instancia enum?

Por lo tanto: es posible el uso de tipos de retorno covariantes con los métodos de enumeración, donde se define un método en la clase de enumeración y luego se anula en los casos, así:

package enumcovariance.test; 

public enum CovariantEnum { 

    INT_INSTANCE(new Integer(3)) { 
     @Override 
     public Integer getData() { 
      return (Integer) super.getData(); 
     } 
    }, 

    STR_INSTANCE("Hello world") { 
     @Override 
     public String getData() { 
      return (String) super.getData(); 
     } 
    }; 

    private final Object data; 

    private CovariantEnum(Object data) { 
     this.data = data; 
    } 

    public Object getData() { 
     return data; 
    } 

} 

Y a continuación, para aprovechar la covarianza de este modo:

package enumcovariance.test; 

import org.junit.Test; 


public class CovariantEnumTest { 

    @Test 
    public void intEnumTest() { 
     Integer i = CovariantEnum.INT_INSTANCE.getData(); 
    } 

    @Test 
    public void strEnumTest() { 
     String s = CovariantEnum.STR_INSTANCE.getData(); 
    } 

} 

En este caso, el compilador está muy bien con mi definición de enumeración, pero el caso de la prueba falla al compilar, diciendo a objeto no puede ser convertido a entero (o cadena). Aparentemente, el compilador solo mira la definición base del método, no el método de anulación. Con una definición de enumeración diferente, tenía el método base abstracto, pero todavía no funcionaba.

Estoy pensando que es algo complejo de hacer con la forma en que las enums se transforman durante el proceso de compilación que evita que funcione, pero quiero estar seguro de que no soy solo yo haciendo algo tonto.

Tenga en cuenta que este caso de prueba es realmente muy contráctil, en mi enumeración real esta funcionalidad sería más útil. Puedo publicarlo si es necesario.

Respuesta

2

El tipo de CovariantEnum.INT_INSTANCE es CovariantEnum que devuelve Object de getData.

Lamentablemente, tampoco puede hacer que el tipo enum sea genérico.

+0

Ya veo, gracias por la respuesta. Esperaba que el tipo fuera la subclase real, pero supongo que es solo una limitación debido a la forma en que las enum se implementan en Java. –

Cuestiones relacionadas