簡體   English   中英

我如何創建通用類Enum <K> 擴展EnumMap並調用super(K.class)?

[英]How may I create an Generic class Enum<K> which extends EnumMap and call super( K.class )?

今天,我的目標是通過擴展 EnumMap創建一個抽象(基)類。 我已經有一個基於EnumMap子類的非常有效的現有原型代碼,並且我想將其轉換為可以與其他Enum類型一起使用的通用庫(即通用Enum<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的父構造函數即K.class的困難。

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>{
            :
   }

雖然基類的泛型版本是最理想的,但似乎這是不可能的。 或我沒有遵循正確的語法來創建所需的' '基類。

甚至知道是否“ 您不能那樣做。 ”是有幫助的,我將把精力轉移到其他結構上。 與重新發明一個完美的現有原型車輪相比, inherit似乎更多。 提前謝謝

代碼的明顯問題是繼承的明顯不適當使用。 您不太可能節省很多內存,並且代碼變得一團糟。

因此,課程開始

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則可以從枚舉的一個實例中獲取Class

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM