Java 如何创建扩展EnumMap并调用super(K.class)的泛型类Enum?

Java 如何创建扩展EnumMap并调用super(K.class)的泛型类Enum?,java,generics,inheritance,constructor,enums,Java,Generics,Inheritance,Constructor,Enums,我的目标是通过扩展枚举映射创建一个抽象基类。我已经有了基于EnumMap子类的优秀原型代码,我想将其转换成一个通用的基础,我可以使用不同的Enum类型,即通用Enum 我遇到的路障是 如何告诉EnumMap构造函数泛型枚举的类? 为了进行比较,在给定枚举的情况下,工作的非泛型类如下所示: 简略地 到目前为止,我的声明如下: public abstract class MapBase<K> extends EnumMap<K, FocusTraversalPolicy&g

我的目标是通过扩展枚举映射创建一个抽象基类。我已经有了基于EnumMap子类的优秀原型代码,我想将其转换成一个通用的基础,我可以使用不同的Enum类型,即通用Enum

我遇到的路障是

如何告诉EnumMap构造函数泛型枚举的类? 为了进行比较,在给定枚举的情况下,工作的非泛型类如下所示:

简略地

到目前为止,我的声明如下:

    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>{
            :
   }
虽然基类的泛型版本是最理想的,但这似乎是不可能的;或者我没有遵循正确的语法来创建我想要的“类”基类


即使知道,你也不能那样做。是有帮助的,我会把精力转移到另一个结构上。与重新发明一个完美的现有原型轮子相比,继承似乎更像是面向对象的。我提前表示感谢。

代码的突出问题是继承的使用显然不恰当。您不太可能节省太多内存,代码会变得一团糟

因此,课程的开始变得

public class TraversalPolicies<K extends Enum<K>> {
    private final Map<K, FocusTraversalPolicy> policies;
或者,如果有可用的枚举实例,则可以从枚举实例中获取该类

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

我修正了你的格式。编辑时请注意预览,保存后请查看帖子。这看起来是严重错误的:扩展EnumMap而不是使用EnumMap,即授权给EnumMap,在所有大写字母中大写非最终字段,从构造函数初始化静态字段,尝试将Dummy实例存储到K类型的变量中。暂时忘记您想要的设计,告诉我们您想要实现什么,因为可能有更好的方法。组合而不是继承呢?虽然我可能被迫使用组合、委托或其他方法来编写更多代码,以实现我今天在一次实例中所做的事情。。。我觉得这些都是毫无意义的回应;因为我和我可以用C或C++来做这个问题,这是怎么做的。在你的个人或同龄人群体中,这可能是一个公平的评论,但没有引用完整的要求。首先也是最重要的是,以我的经验来看,面向对象设计的最大好处是保持事物干燥,不要重复。Java代码仅用于说明,并强调相互关联的要点。这就像是一个伪代码的预先思考,一个有趣的替代方案,ta。但这项政策不是-。要求将不同的枚举值映射到策略。该代码正在运行,非常简单,经过测试。希望使基代码通用于小g。就这些,我不明白。您的代码具有类型为K的策略变量,该类型用作EnumMap的键,因此应该声明为K extends Enum。使用机会主义继承减少源代码的大小很小,不值得它造成混乱。当前代码中没有“混乱”。它很快乐;对于大约17行,我们得到了一个双向枚举特定的字段管理器。
    class MapBase<K extends Enum<K>> 
        extends EnumMap<K, FocusTraversalPolicy>{
            :
   }
public class TraversalPolicies<K extends Enum<K>> {
    private final Map<K, FocusTraversalPolicy> policies;
    public TraversalPolicies(Class<K> clazz) {
        this.policies = new EnumMap<>(clazz);
    public TraversalPolicies(K defaultPolicy) {
        this.policies = new EnumMap<>(defaultPolicy.getDeclaringClass());