Ich habe eine ganze Weile mit Google verbracht, um einige Informationen zu diesem Thema zu finden, aber Ergebnisse, die sich sowohl auf Java-Enums als auch auf kovariante Rückgabetypen beziehen, waren so gut wie nicht existent.Java-kovariante Rückgabetypen funktionieren nicht für das Überschreiben von Methoden einer enum-Instanz?
So: ist es möglich, kovariante Rückgabetypen mit Enum-Methoden zu verwenden, in dem Sie eine Methode in der Enum-Klasse definieren und sie dann in den Fällen außer Kraft setzen, etwa so:
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;
}
}
Und dann zu nutzen die Kovarianz wie folgt:
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();
}
}
In diesem Fall wird der Compiler mit meiner Enumerationsdefinition in Ordnung ist, aber der Testfall ausfällt, sagte Objekt kompilieren kann nicht in Integer umgewandelt werden (oder String). Anscheinend betrachtet der Compiler nur die Basisdefinition der Methode, nicht die überschreibende Methode. Mit einer anderen Enum-Definition hatte ich die Basismethode abstrakt, aber das hat immer noch nicht funktioniert.
Ich denke, es ist etwas komplexes mit der Art zu tun, wie Enums während des Kompilierungsprozesses transformiert werden, die es daran hindert zu arbeiten, aber ich möchte sicher sein, dass ich nicht nur etwas Dummes mache.
Beachten Sie, dass dieser Testfall zugegebenermaßen sehr umstritten ist, in meiner aktuellen enum wäre diese Funktionalität nützlicher. Ich kann es bei Bedarf posten.
Ich sehe, danke für die Antwort. Ich hatte gehofft, der Typ wäre die eigentliche Unterklasse, aber ich denke, es ist nur eine Einschränkung aufgrund der Art, wie Enums in Java implementiert sind. –