[英]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.