2011-01-07 13 views
5

Google'da bu konu hakkında bazı bilgiler bulmak için epey zaman harcadım, ancak hem Java enumları hem de kovaryant dönüş türleriyle ilgili sonuçlar neredeyse hiç bulunmuyordu.Java kodvaryantı dönüş türleri, bir enum örneğinin geçersiz kılma yöntemleri için çalışmaz mı?

Yani: yararlanmak ardından

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

} 

Ve: Eğer enum sınıfında bir yöntemi tanımlamak mümkün olduğunda enum yöntemleri ile bildirdiğinden dönüş türleri kullanmak ve daha sonra şöyle, durumlarda bunu geçersiz olduğunu şöyle kovaryans: derleyici benim enum tanımıyla gayet Bu durumda

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

} 

ancak test durumu söyleyerek Nesne tamsayı (veya dize) için dönüştürülemez, derlemek başarısız olur. Görünüşe göre derleyici, yalnızca yöntemin temel tanımına bakar, geçersiz kılma yöntemini değil. Farklı bir enum tanımıyla temel yöntem özeti vardı, ancak bu hala işe yaramadı.

Derlemenin çalışma sırasında çalışmasını engelleyen enemlerin dönüştürülme şekliyle karmaşık bir şey olduğunu düşünüyorum, ancak bunun sadece aptalca bir şey yapmıyor olduğuna emin olmak istiyorum.

Bu test vakasının kabul edildiğine çok dikkat etmeliyim, asıl benliğimde bu işlevsellik daha kullanışlı olacaktır. Gerekirse gönderebilirim.

cevap

2

CovariantEnum.INT_INSTANCE'un türü CovariantEnum şeklindedir ve ObjectgetData'dan döner.

Ne yazık ki, enum tür jenerik yapamazsınız.

+0

Anlattığım cevap için teşekkürler. Türün asıl alt sınıf olacağını umuyordum, ama sanırım Java'daki enumların uygulanış şekli nedeniyle bir sınırlama. –

İlgili konular