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.
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. –