2009-07-01 18 views
39

Bunun iyi bir fikir olduğunu% 100 ikna olmuş değilim, ama şu anda olduğu gibi uygulanacağı bugün bazı kod çarptı: MyWidget sonra mValueMap kullanmak yöntemler sunarBir arabirimi uygulayan bir enum olmak için genel bir parametrenin nasıl gerekir?

class MyWidget <T extends Enum<T> > { 
    MyWidget(Map<T, Integer> valueMap) { 
    mValueMap = valueMap; 
    } 

    Map<T, Integer> mValueMap; 
} 

Enum geçirildi, dönüştürmek bir Integer'a.

Ne benim numaralandırma türünü ediyorum ki ben bu refactor çalışıyordu yaptığını düşündüğünü:

interface MyInterface { 
    public Integer getValue(); 
} 

enum MyEnum implements MyInterface { 
    foo, bar; 
    public Integer getValue() { 
    return ordinal(); 
    } 
} 

Ve sonra böyle belli belirsiz görünüyordu şey haline MyWidget yeniden yazmak mümkün etmişti:

public class MyWidget<T extends Enum<T> extends MyInterface> { 
    ... 
} 

ve MyWidget içinde T tipi nesneler üzerinde MyInterface den getValue() yöntemi çağırmak mümkün olacaktır. Sorun şu ki, "<T extends Enum<T> extends MyInterface>" geçerli sözdizimi değil. Bunu çekmenin bir yolu var mı?

Sadece MyWidget<T extends MyInterface> olmak istemiyorum, çünkü T sayısının bir numaralandırma olması önemlidir.

Şimdiden teşekkürler!

cevap

77

Kullanım yerine '&':

public class MyWidget<T extends Enum<T> & MyInterface> { 
    ... 
} 

JLS çağrılar bu bir "kesişme türü" ama Java öğreticiler bunun hiçbir söz bulabilirsiniz. Sadece "extends" un yapmasını istediğiniz şeyi yaptığını söyleyeceğim.

Ayrıca, kesişim türünde istediğiniz kadar çok türde olabileceğinizi belirtmeliyim. isterseniz Yani, yapabileceği:

public class MyWidget<T extends Enum<T> & MyInterface & Serializable & Cloneable> { 
    ... 
} 

[Not: Bu kod örneği Cloneable arayüzünün onaylandığı şeklinde olmamalıdır; o zaman sadece kullanışlı]

+0

& sözdizimi düzgün, ancak onu kullanarak genellikle bir kod kokusuna dönüştüğünü ve bir şey modelinizle ilgili doğru olmadığını gösteren bir belirtidir. – skaffman

+2

Katılıyorum (Sanırım bunu belki bir veya iki kez kullandım). Ancak, bir arayüz uygulayan envanterlerde, bunun uygun olduğunu düşünüyorum. –

+0

Mükemmel! Tam olarak aradığım şey bu. Çok teşekkürler! – Sbodd

1

JDK 7 (örneğin: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/FileVisitOption.html) arabirimleri uygulamak çeteleler kullanımının çok yapıyor için JSR 203 (yeni yeni IO) şeyler. Onlara bazı esneklik payı sağlamak için gelecekteki ek enum seçenekleri kümeleri için gelecek. Yani bu, uygulanabilir bir yaklaşım ve açık bir şekilde bir büyük Güneş projesinde pek çok düşüncenin ardından seçildi.

+0

Temiz.Umarım sakalım gri gitmeden önce java 7 görünecektir. – skaffman

+0

Bu malzemeyi kullanan az miktarda kod yazarken, benim izlenimim biraz garip. Başka bir yerde gördüğümü söyleyemem. 2010 yılında adında 7 bir şey çıkacağından eminim. JCP tarafından onaylandığı gibi "Java 7" olup olmayacağını bilmiyorum. Sadece Oracle buna cevap verebilir ... –

İlgili konular