2017-07-21 59 views
3

我想用兩個簡單的方法創建一個類 - 第一個註冊需要處理的類型。第二個將處理所有已註冊的類型。我得到的問題是,我想註冊/過程的類有一定的限制 - 他們必須是實現和接口的枚舉Java:如何定義一個實現接口的枚舉集合

我不能完全解決如何定義將用於存儲的集合註冊類型。我的代碼的簡化版本是:

public class Example { 
    interface MyType { 
     // Add methods here 
    } 

    private List<what-goes-here?> store = new ArrayList<>(); 


    public <T extends Enum<?> & MyType> void registerType(@Nonnull Class<T> type) { 
     store.add(type); 
    } 


    public void processAll() { 
     for (T t : store) {   // Where do I define T? 
      // process t 
     } 
    } 
} 
+3

您的代碼不一致。在'register'中,你正在將'Class'對象存儲到列表中,在'processAll'中,你期望'T'實例出來。除此之外,爲什麼這些對象是'enum's很重要?似乎沒有對該財產的任何依賴,很難想象它將如何成爲一個有用的財產。 – Holger

+0

@Holger嗨,我想他想處理所有枚舉常量實例。 –

+2

@ holi-java提問者不應該要求我們猜測他們的意圖。可能有很多更好的解決方案,具體取決於他們實際想要做的事情。 – Holger

回答

4

這個怎麼樣?

public class Example { 

    interface MyType { 
     // Add methods here 
    } 

    //     v--- save it as enum class 
    private List<Class<? extends Enum<?>>> store = new ArrayList<>(); 


    public <T extends Enum<?> & MyType> void registerType(@Nonnull Class<T> type) { 
     store.add(type); 
    } 


    public void processAll() { 
     //   v--- iterate each enum type 
     for (Class<? extends Enum<?>> type : store) { 
      Enum<?>[] constants = type.getEnumConstants(); 
      for (Enum<?> constant : constants) { 
       //v--- downcasting to the special interface 
       MyType current = (MyType) constant; 
       // TODO 
      } 
     } 
    } 

} 
+0

在這種情況下只聲明商店來保存「對象」,它是無關緊要的,因爲你正在施放任何方式,盡我所能告訴 – Eugene

+0

@Eugene嗨,感謝您的反饋。但是如果將'Class'保存爲'Object',它將在'processAll'中生成未經檢查的警告,這就是爲什麼我將它保存爲'Enum '而不是'MyType'的原因。我是對的,親愛的? :) –

+0

我知道,但你可以明顯地壓制這一點......無論如何你並沒有暴露'store'(它是私人的)。如果你要公開它,那麼'MyType current =(MyType)常量'理論上仍然會失敗,因爲某些枚舉實例不會實現'MyType'。 – Eugene

相關問題