2011-01-07 11 views
5

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.

Antwort

2

Der Typ CovariantEnum.INT_INSTANCE ist CovariantEnum, der Object von getData zurückgibt.

Leider können Sie den Typ enum nicht generisch machen.

+0

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

Verwandte Themen