【问题标题】:How to have a parameter that is one of several enum types in a class如何有一个参数是类中的几种枚举类型之一
【发布时间】:2016-09-02 07:03:12
【问题描述】:

我有一个类,它有几个表示不同类型设备名称的枚举。

public class DeviceNames {
    public enum Microsoft {
        DeviceName1, DeviceName2, DeviceName3
    }

    public enum Apple {
        DeviceName1, DeviceName2, DeviceName3
    }
}

我有不同的具体设备将实现的接口(接口指定了它可以通信的方式)

public interface IPDevice{
    //factory method
    Device createNewIPDevice(DeviceNames.Enum<E> deviceName);
}

public interface USBDevice{
    //factory method
    Device createNewUSBDevice(DeviceNames.Enum<E> deviceName);
}

我有一个抽象类

public abstract class Device {
    String deviceName;

    protected Device(String deviceName) {
        this.deviceName = deviceName;
    }
}

以及实现一个或多个接口的抽象类的具体实现

public class MicrosoftDevice implements IPDevice{
    @Override
    public Device createNewIPDevice(DeviceNames.Microsoft deviceName) {
        return super(deviceName.toString());
    }
}

public class AppleDevice implements IPDevice, USBDevice {
    @Override
    public Device createNewIPDevice(DeviceNames.Apple deviceName) {
        return super(deviceName.toString());
    }

    @Override
    public Device createNewUSBDevice(DeviceNames.Apple deviceName) {
        return super(deviceName.toString();
    }
}

我想使用枚举来确保它们只提供有效的设备名称(而不是传递字符串)

如何让接口方法接受一个可以采用通用枚举类型但只能采用 DeviceNames 类中的枚举的参数?

【问题讨论】:

  • 我不确定将域值作为枚举是否是个好主意,但如果这是一个硬编码的哈希,II 将使用单个制造商/设备枚举,它具有所有组合 APPL_NAME1("Apple", "Name1"), APPL_NAME2("Apple", "Name2"), MSFT_NAME1("Microsoft", "Name1") 等.
  • @eckes 问题在于它允许调用者传入任何枚举。 (即,他们可以将APPL_NAME1 传递给MicrosoftDevice 中的方法)。如果使用了错误的制造商,我可以通过抛出异常来解决这个问题,但我想知道是否有办法导致编译错误,所以不需要抛出异常。

标签: java generics enums


【解决方案1】:

我问了一个后续问题here。接受的答案解决了这个问题。

引用@Andreas(回答另一个问题的人)

你让接口本身实际上接受了泛型参数

工作代码如下所示(此处未包含的代码保持不变):

public interface IPDevice<DeviceName extends Enum> {
    //factory method
    Device createNewIPDevice(DeviceName deviceName);
}

public interface USBDevice<DeviceName extends Enum> {
    //factory method
    Device createNewUSBDevice(DeviceName deviceName);
}

public class MicrosoftDevice implements IPDevice<DeviceNames.Microsoft> {
    @Override
    public Device createNewIPDevice(DeviceNames.Microsoft deviceName) {
        return super(deviceName.toString());
    }
}

public class AppleDevice implements IPDevice<DeviceNames.Apple>, USBDevice<DeviceNames.Apple> {
    @Override
    public Device createNewIPDevice(DeviceNames.Apple deviceName) {
        return super(deviceName.toString());
    }

    @Override
    public Device createNewUSBDevice(DeviceNames.Apple deviceName) {
        return super(deviceName.toString();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多