Java-枚举通配符

问题描述

我在实现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的需求。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...