我在实现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作为参数传递。有没有办法避免这种情况?
答案 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的要求。