Java - 枚举通配符

时间:2011-03-25 16:48:41

标签: java enums wildcard abstract

我在实现Java功能时遇到了一些问题。

我有Sensors的列表。我有不同的类型,它们都扩展了基类Sensor。 我在基类中有一些抽象函数,我希望这些函数将Enum作为参数。问题是Enum对于每个子类都是唯一的,因此,我不能在基类中声明Enum。

以下代码以Enum为参数。我知道这不是合法的语法,但我只是想说明这是我希望将子类Enum作为参数的地方。


private Vector<Sensor> sensors;

public abstract class Sensor {  
    public Sensor() {}  
    public abstract int getParam(Enum param);  
    public abstract void setParam(Enum param, int value);  
}

public class TempSensor extends Sensor {
    // Parameter names
    public static enum TEMP_PARAMETERS{ PARAM_ALARM_HI, PARAM_ALARM_LO }

    public TempSensor() {}

    @Override
    public int getParam(TEMP_PARAMETERS param) {
            // Will do some stuff here
            return 0;
    }

    @Override
    public void setParam(TEMP_PARAMETERS param, int value) {
            // Will do some stuff here
    }
}

如果不同的Enums实现了一个接口,我可以在抽象方法中使用该接口作为参数类型,但是我可以将不属于相应类的Enum作为参数传递。有没有办法避免这种情况?

3 个答案:

答案 0 :(得分:3)

看起来你想要矛盾的事情。使用多态的全部意义是利用substitution principle。 如果要使用类层次结构并确保将正确的类型输入到正确的对象,则可以考虑使用工厂模式。 我强烈建议不要在Enums上继承; Java处理得不好。

答案 1 :(得分:2)

你走在正确的轨道上。假设您有一个名为MyEnumTypeInterface的标记接口,只需让您的不同枚举实现该接口即可。然后使用MyEnumTypeInterface作为接受枚举的方法的形式参数的类型。但是,您需要确保获得实现MyEnumTypeInterface的枚举,而不仅仅是实现MyEnumTypeInterface的任何其他类:

public <E extends Enum<E> & MyEnumTypeInterface>void getParam(E e)

这可以确保形式参数是enum并且它实现MyEnumTypeInterface; methed不接受作为参数,另一个类也实现MyEnumTypeInterface

所以你的课程最终看起来像这样:

public interface MyEnumTypeInterface {
}

public abstract class Sensor {  
    public Sensor() {}  
    public abstract <E extends Enum<E> & MyEnumTypeInterface>int getParam(E param);  
    public abstract <E extends Enum<E> & MyEnumTypeInterface>void setParam(E param, int value);  
}

public enum TempEnum extends MyEnumTypeInterface {
    PARAM_ALARM_HI, 
    PARAM_ALARM_LO
}


public class TempSensor extends Sensor {

    public TempSensor() {}

    @Override
    public<E extends Enum<E> & MyEnumTypeInterface>int getParam(E param) {
            return 0;
    }

    @Override
    public <E extends Enum<E> & MyEnumTypeInterface>void setParam(E param, int value) {
            // Will do some stuff here
    }
}

答案 2 :(得分:0)

所以你希望每个Sensor都能使用特定的param类型吗?这意味着要Sensor通用。

public abstract class Sensor<P extend Enum<P>> {  
    public Sensor() {}  
    public abstract int getParam(P param);  
    public abstract void setParam(P param, int value);  
}

您的设计可能存在更大的问题。修复这些可能会删除get和set的要求。