当前位置: 首页 > 知识库问答 >
问题:

在子类上下文中使用泛型类型和使用枚举键键入的映射

廖鸿达
2023-03-14

我有以下带有父类的结构,几个子类,每个子类都有自己的枚举和各种键。父类需要具有具有以枚举为特征的键的映射,但枚举类型是抽象的 - 它由实例化的子类确定。

我想使用泛型类型来要求Enum类型来自该特定类 - 因此您只能将APPLE添加到水果中,将芹菜添加到蔬菜中,反之亦然。我的应用程序还要求任何 Food 对象能够查询其可能的类型(例如,打印出所有可能的类型,而不仅仅是我们在 Map 中的类型)。

我如何使用泛型类型来实现这一切呢?我在带有EnumSet声明的行上遇到编译器错误< code >不可编译的源代码-类型参数E不在类型变量E的界限内。

import java.util.*;

public class sandbox {

    private static class Food<E extends Enum> {

        public Map<E, Integer> qty = new HashMap<>();
        public EnumSet<E> types = EnumSet.allOf(E);

    }

    private static class Fruit extends Food<Fruit.Type> {

        public static enum Type {
            APPLE,
            ORANGE
        }

    }

    private static class Veggie extends Food<Veggie.Type> {

        public static enum Type {
            CUCUMBER,
            CELERY
        }
    }

    public static void main(String[] args) throws Exception {
        Fruit mondays = new Fruit();
        mondays.qty.put(Fruit.Type.APPLE, 1);
        mondays.qty.put(Fruit.Type.ORANGE, 3);

        Veggie tuesdays = new Veggie();
        tuesdays.qty.put(Veggie.Type.CELERY, 10);

        mondays.qty.forEach((f, qty) -> System.out.println("Buying " + f + " in qty " + qty));
        tuesdays.qty.forEach((f, qty) -> System.out.println("Buying " + f + " in qty " + qty));

        mondays.types.forEach(System.out::print);

    }
}

共有1个答案

袁泓
2023-03-14

我将利用Enum可以实现接口的事实,使用接口作为<code>食物</code>的类型约束,而不是<code>Enum

java prettyprint-override">    private static interface FoodType {}

    private static abstract class Food<T extends FoodType> {

        public Map<T, Integer> qty = new HashMap<>();

        protected abstract Set<T> getTypes();

    }

    private static class Fruit extends Food<Fruit.Type> {

        public static enum Type implements FoodType {
            APPLE,
            ORANGE
        }

        @Override
        protected Set<Type> getTypes() {
            return EnumSet.allOf(Type.class);
        }

    }

    private static class Veggie extends Food<Veggie.Type> {

        public static enum Type implements FoodType {
            CUCUMBER,
            CELERY
        }

        @Override
        protected Set<Type> getTypes() {
            return EnumSet.allOf(Type.class);
        }
    }

如果您想更加DRY并避免在每个子类中实现getTypes(),您可以将受保护的构造函数添加到Food并传入Class,每个子类构造函数设置适当的FoodType类。

 类似资料:
  • 问题内容: 我的Java模型上有一个枚举类型,我想映射到数据库中的表。我正在使用“hibernate注释”,但我不知道该怎么做。由于我搜索的答案比较旧,我想知道哪种方法最好? 提前致谢 问题答案: 除了注释,您还需要其他东西吗?例如,以下枚举: 可以这样使用和注释: 您可以使用批注的enum属性指定枚举应如何在数据库中持久化。指定该枚举将作为整数值保留。在这里,设置为将永久保存为0,保留为1,依此

  • 我有一个场景,我必须使用Mapstrt将对象(来自网络请求)转换为对象(数据层)来处理对象映射。我正在尝试创建一个通用的接口,以防止必须为每个资源定义自定义映射器,如下所示: 但这会导致构建错误(但是编译成功): 错误:(13,4)错误:无法为泛型类型变量源生成映射方法。 这不可能吗?如果没有,我将不得不为每个创建一个自定义映射器,并使用根据类类型等告诉反序列化器要使用哪个映射器。。。它可能会变得

  • 问题内容: 我的Java模型上有一个枚举类型,我想映射到数据库中的表。我正在使用休眠注释,但我不知道该怎么做。由于我搜索的答案比较旧,我想知道哪种方法最好? 提前致谢 问题答案: 除了注释,您还需要其他东西吗?例如,以下枚举: 可以这样使用和注释: 您可以使用批注的enum属性指定枚举应如何在数据库中持久化。指定该枚举将作为整数值保留。在这里,设置为将永久保存为0,保留为1,依此类推。 替代方法是

  • 非常感谢您在广告方面的帮助。! 使用枚举类型的扫描仪时出错。然而,我不允许在这个任务中使用Buffer(InputStreamReader)。围绕它最好的工作是什么? 我收到以下错误: 代码: import java.util.Scanner; 公开课申请{ }

  • 问题内容: 我想到的是一个涉及嵌套枚举的数据结构,因此我可以执行以下操作: 如果有方法声明: 然后我可以说(适当): 这是我想出的: 和界面: 我想我只是想用Java来完成这种事情的最佳方法,或者是否需要编写一堆if语句来处理单个Drink.values()。有什么帮助吗? 问题答案: 首先,您提供的示例代码在某种程度上违反了“德米特律”-因为COLUMBIAN实例字段仅用于检索标签。同样,通过这

  • 从这个问题,有可能注入map与枚举? 例如,我有枚举: 我有一些与实现的接口: 但这样的注入不起作用: 我想自动注入。如何修复它,在spring框架端生成这样的代码?