gpt4 book ai didi

java - 如何创建一个扩展 EnumMap 并调用 super( K.class ) 的通用类 Enum

转载 作者:行者123 更新时间:2023-12-01 08:51:39 26 4
gpt4 key购买 nike

天啊,我的目标是通过 extend-ing 创建一个抽象(基)类 EnumMap 。我已经有了基于 EnumMap 运行良好的现有原型(prototype)代码。子类,我想将其转换为可以与不同枚举类型一起使用的通用基(即通用 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 的父构造函数时遇到困难,即。

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 似乎更面向对象而不是重新发明一个完美的现有原型(prototype)轮。提前致谢。

最佳答案

代码中最明显的问题是继承的明显不当使用。您不可能节省太多内存,并且代码会变得一团糟。

所以类(class)开始就变成了

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());

关于java - 如何创建一个扩展 EnumMap 并调用 super( K.class ) 的通用类 Enum<K> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42356205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com