【问题标题】:Relating enums and using in generics关联枚举和在泛型中使用
【发布时间】:2012-12-20 12:16:34
【问题描述】:

我需要为国家和州创建枚举。

  1. 创建和关联这些枚举的最合适方法是什么(在 X 国可以有 P、Q、R 等状态)?

  2. 如果我有一个使用 Country 类型参数化的泛型类,我是否可以声明一个方法来接受仅适用于特定国家的 State?

例如:

public abstract class TestClass <T extends Country> {
    public void addState(T.State state);
    public List<T.State> getSelectedStates();
}

编辑 1: 为了便于维护,我希望每个国家/地区都有一个单独的州枚举,而不是包含所有国家/地区的数百个州的单个州枚举。请发表评论。

编辑 2:我使用以下解决方案来解决与此非常相似的问题。

解决方案:正如@Bohemian 建议的那样,

interface Country { }
interface State<T extends Country> { }

public class Countries {
    public static class USA implements Country { }
    public static class India implements Country { }
}

enum UsaStateEnum implements State<Countries.USA> {
    NY, MA, MD, CA
}

enum IndiaStateEnum implements State<Countries.India> {
    DEL, BLR
}

class GenericClass<T extends Country> {

    List<State<T>> states;

    public void addState(State<T> state) {
        if (states == null) {
            states = new ArrayList<State<T>>();
        }
        states.add(state);
    }

    public List<State<T>> getSelectedStates() {
        return states;
    }
}

public class NestedEnumTest {
    public static void main(String[] args) {
        GenericClass<Countries.USA> obj = new GenericClass<Countries.USA>();
        obj.addState(UsaStateEnum.MA);
        // obj.addState(IndiaStateEnum.DEL); // NOT ALLOWED

        List<State<Countries.USA>> states = obj.getSelectedStates();
    }
}

【问题讨论】:

    标签: java generics enums


    【解决方案1】:

    要回答第 1 部分,您可以定义两个枚举,其中一个引用另一个,如下所示:

    public enum State {
        A, B, C, D, E
    }
    
    public enum Country {
        USA(State.A, State.B),
        UK(State.C, State.D);
    
        private final List<State> states;
    
        Country(State... states) {
            this.states = Arrays.asList(states);
        }
    
        public List<State> getStates() {
            return states;
        }
    }
    

    回答第 2 部分“否” - 没有办法将特定类的实例限制为子集。

    如果您为每个国家/地区定义一个单独的类并为其拥有的州定义一个单独的枚举,您可以,但这似乎不是一个好主意。

    【讨论】:

    • 非常感谢。您能否在下面验证我对您最后陈述的理解(“如果您为每个...定义一个单独的类,您可以”)是否正确? enum CountryEnum 实现 Country { USA, INDIA } enum UsaStateEnum 实现 State { NY, MA } enum IndiaStateEnum 实现 State { DEL, BLR } 抽象类 TestClass { public void addState(U state);公共列表 getSelectedStates(); }
    • 当我想得更多时,我实际上更愿意为每个国家/地区创建一个单独的州枚举,而不是一个包含所有国家/地区数百个州的州枚举。
    【解决方案2】:

    你可以让一个枚举实现这样的接口:

    public enum MyEnum implements MyInterface<MyType> {
        // ...
    }
    

    除了实现接口enums 还不支持继承,但如果您希望在您的enums 中拥有通用功能,您可以随时将一些策略对象组合到其中。

    【讨论】:

    • 不确定这是否有帮助。 (也不确定我是否理解这个问题)。
    • 是的,对我来说也有点模糊和晦涩。
    • “还没有?”有计划吗? (特别是看到他们已经扩展了 java.lang.Enum)。
    • 我不知道它们,但我从没想过java会有闭包,我们在这里:)
    • @Thilo,AdamArold:请让我知道我的问题中不清楚的部分,以便我详细说明。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    相关资源
    最近更新 更多