2011-01-07 10 views
5

Spędziłem sporo czasu z Google, aby znaleźć informacje na ten temat, ale wyniki odnoszące się zarówno do wyliczenia Java, jak i kowariantnych typów zwracanych były praktycznie nieistniejące.Typy zmiennych Covariant języka Java nie działają dla nadpisania metod instancji wyliczeniowej?

Więc: czy jest to możliwe do wykorzystania kowariantna typów zwracanych z metod enum gdzie można zdefiniować metodę w klasie enum, a następnie zastąpić ją w przypadkach, tak jak poniżej:

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; 
    } 

} 

A potem wykorzystać kowariancja tak:

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(); 
    } 

} 

W tym przypadku kompilator jest w porządku z mojej definicji enum, ale w przypadku niepowodzenia testu kompilacji, mówiąc, obiekt nie może zostać zamienione na Integer (lub ciąg znaków). Wygląda na to, że kompilator analizuje tylko podstawową definicję metody, a nie metodę nadpisywania. Z inną definicją wyliczenia miałem abstrakcyjną metodę bazową, ale to wciąż nie zadziałało.

Myślę, że jest to coś skomplikowanego w sposobie przekształcania wyrażeń podczas procesu kompilacji, który uniemożliwia działanie, ale chcę mieć pewność, że nie tylko ja robię coś głupiego.

Należy zauważyć, że ten przypadek testowy jest wprawdzie bardzo urażony, w moim rzeczywistym wyliczeniu funkcja ta byłaby bardziej przydatna. Mogę to opublikować w razie potrzeby.

Odpowiedz

2

Typ CovariantEnum.INT_INSTANCE to CovariantEnum, który zwraca Object z getData.

Niestety, nie można utworzyć typu generycznego enum.

+0

Rozumiem, dziękuję za odpowiedź. Miałem nadzieję, że typ będzie właściwą podklasą, ale myślę, że to tylko ograniczenie ze względu na sposób implementacji enum w Javie. –