问题描述
我在实现Java功能时遇到一些问题。
我有一个“ 0”清单。我有不同的种类,它们都扩展了基类
Sensor
。
我在基类中有一些抽象函数,并且我希望这些函数将Enum作为参数。问题在于,每个子类的Enum都是唯一的,因此,我无法在基类中声明Enum。
下面的代码将“ 2”作为参数。我知道这不是合法的语法,但我只想说明一下,这就是我想将子类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实现一个接口,则可以在抽象方法中将该接口用作参数类型,但是然后我可以将不属于相应类的Enums作为参数传递。有办法避免这种情况吗?
解决方法
看起来您想要矛盾的事物。使用多态的全部目的是要利用替换原理。
如果要具有类层次结构,并确保将正确的类型输入到正确的对象,则可以考虑使用工厂模式。
我强烈建议不要继承Enums。 Java处理得不好。
, 您走在正确的轨道上。假设您有一个名为
MyEnumTypeInterface
的标记接口,只需让您不同的枚举实现该接口即可。然后将ѭ6用作接受枚举的方法的形式参数的类型。但是,您需要确保获得的枚举实现了MyEnumTypeInterface
,而不仅仅是其他实现MyEnumTypeInterface
的类:
public <E extends Enum<E> & MyEnumTypeInterface>void getParam(E e)
这样可以确保形式参数是enum
,并实现MyEnumTypeInterface
。该方法将不接受作为参数的另一个类,该类也实现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
}
}
, 因此,您想让每个ѭ1都使用特定的参数类型吗?那将意味着使“ 1”成为通用。
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的需求。