2017-02-20 56 views
0

G'day,我的目標是創建一個抽象(基礎)類擴展 -ing EnumMap。我已經有了基於EnumMap子類的現有原型代碼,並且我想將其轉換爲可用於不同枚舉類型(即通用Enum<K>)的通用基類。如何創建擴展EnumMap並調用super(K.class)的Generic類枚舉<K>?

的路障我打的......

  • 如何分辨EnumMap構造方法的類通用Enum<K>的?

爲了比較的工作(非通用)類如下所示,給出的Enum<States>:翻譯成一個通用版本

public class MyMap extends EnumMap<States, FocusTraversalPolicy> 
    { 
     private static States DEFAULT_POLICY; 
     private static States currentPolicy = DEFAULT_FLOW; 

     public MyMap(){ 
      this(States.DATA_INPUT); 
     } 

     public MyMap (final ProcessState defaultPolicy ){ 

      super(States.class); 

      DEFAULT_POLICY = defaultPolicy; 
      currentPolicy = DEFAULT_FLOW; 
     } 
    } 

我的能力已經達到了一組另類的問題,從而沸騰直到將Enum類型(K.class)傳遞給EnumMap的父構造函數(即,

Cannot select from type variable 

和(簡要

No suitable constructor found ... 
argument mismatch; Class<CAP#1> cannot be converted to Class<K>) 

我聲明到目前爲止看起來是這樣的:

public abstract class MapBase<K> extends EnumMap<K, FocusTraversalPolicy>{ 

     private K DEFAULT_POLICY; 
     private K currentPolicy; 

     private Enum Dummy { 
      NOTHING 
     } 

     private MapBase() {  // disable empty constructor 
      this(Dummy.NOTHING); // Exclude NullPointerException-s 
     } 

     public MapBase(final K defaultPolicy) // Default compulsory 
     { 
      super(K.class);     // <-- Cannot select from type variable 
               // OR 
      super(defaultPolicy.getClass()); // <-- No suitable constructor found 

      DEFAULT_POLICY = defaultPolicy; 
      currentPolicy = DEFAULT_FLOW; 
     } 
    } 

這是據我得到了。我試圖用一些或多或少的不同方式來告訴我同樣的事情,例如

class MapBase<K extends Enum<K>> 
     extends EnumMap<K, FocusTraversalPolicy>{ 
      : 
    } 

雖然基類的泛型版本是最可取的,但似乎這可能是不可能的;或者我沒有按照正確的語法來使'種''我想要的基礎類。

即使知道是否「你不能這樣做」是有幫助的,我會將我的努力轉移到不同的結構。它看起來更像OO到inherit而不是重新發明一個完美的現有原型車輪。我提前感謝。

+1

我修正了你的格式。編輯時請注意預覽,並在保存後查看帖子。 –

+1

這看起來嚴重錯誤:擴展EnumMap使用一個(即委託給EnumMap),在全部大寫非大寫字段,從構造函數初始化靜態字段,嘗試將Dummy實例存入K類型變量。暫時忘掉你想要的設計,並告訴我們你想要達到什麼目的,因爲這可能有更好的方法。 –

+0

構成與繼承有什麼關係? – efekctive

回答

1

代碼的明顯問題是顯然不適當地使用繼承。你不太可能節省太多內存,代碼變得混亂。

所以課程開始變得

public class TraversalPolicies<K extends Enum<K>> { 
    private final Map<K, FocusTraversalPolicy> policies; 

EnumMap的構造需要枚舉的Class,因爲它會做一些時髦的索引的順序進值的數組。

直接的做法是將Class對象傳遞給您的泛型類。

public TraversalPolicies(Class<K> clazz) { 
     this.policies = new EnumMap<>(clazz); 

另外,該Class可以從枚舉的實例,如果你有一個可用的拍攝。

public TraversalPolicies(K defaultPolicy) { 
     this.policies = new EnumMap<>(defaultPolicy.getDeclaringClass()); 
+0

有趣的替代品,ta。但該政策並非。要求是將不同的枚舉值映射到策略。該代碼正在運行,它非常簡單並經過測試。希望使基本代碼_generic_(小g)。就這些_。 – will

+1

我不關注。你的代碼有一個策略變量,它的類型'K'被用作'EnumMap'的鍵,所以應該聲明爲'K extends Enum '。使用機會繼承來減少源代碼的大小是微不足道的,不值得它創建的混亂。 –

+0

當前代碼中沒有'_mess_'。它非常高興;對於大約17行,我們得到了一個雙向Enum特定的字段管理器。 – will