java - 一般应用枚举成员或方法

标签 java generics inheritance enums wildcard

我有一个接口(interface)ServiceArgument,它定义了size() promise 。

public interface ServiceArgument {
    public int size ();
}

我的一些enum类型实现了这个接口(interface)

public enum StringCode implements ServiceArgument {
    FOO,
    BAR,
    BACON,

    public int size() {
        return values().length;
    }
}

我的一些类遵循 EnumService 抽象类。

public abstract class EnumService {
    abstract void query (Enum<? extends ServiceArgument> e);
}

最后,某个类扩展了这个抽象类:

public class ServiceTranslation extends EnumService implements Serializable {
/**some code and ctors and transient stuff etc **/

    @Override
    void query (Enum<? extends ServiceArgument> e) {
//line that matters :
        if (e.ordinal() >= e.size()) {
            throw InvalidStringCodeAsked();
    }
}

我的问题是,我不能在最后一行使用 e.size(),因为我不会在示例枚举中使用 FOO.size()。 有没有办法:

1) 专门化 query 方法在 EnumService 的具体实现中接受的参数

2) 获取在 ServiceTranslation.query(MYSTERIOUS.ENUM) 中调用的 Enum 的具体类型,以便能够调用 ConcreteENUM.size()。甚至 ConcreteEnum.values().length,都是一样的。

3)甚至过滤所有不是来自正确枚举类型的内容,通过方法重写直接抛出 InvalidEnumeratedTypeException ,但我不熟悉多重重写。

4)我没想到的事情

编辑:评论中的@shmosel是正确的,即使我得到错误的枚举作为参数,它也永远不会大于它的大小。将其与其大小进行比较是没有意义的。

最佳答案

这个怎么样?

public abstract class EnumService {
    abstract <T extends Enum<T> & ServiceArgument> void query (T e);
}

public class ServiceTranslation extends EnumService implements Serializable {
    @Override
    <T extends Enum<T> & ServiceArgument> void query (T e) {
       if (e.ordinal() >= e.size()) {
            throw InvalidStringCodeAsked();
       }
    }
}

关于java - 一般应用枚举成员或方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36883964/

相关文章:

java - 如果同名字段继承自两个源(类和接口(interface))会发生什么

c# - 有什么方法可以忽略 contentpresenter 中的应用程序资源

java - 如何确保列表中的项目是连续的?

java - 如何确保所有生成的线程都已完成以便处理可以继续?

arrays - 从数组中删除数组项

java - Java 中的泛型类

c# - 在C#中使用Lambda确定非相等属性值

JavaScript,意大利面条式代码和组织的问题

java - 如何更改 Swagger-ui URL 前缀?

java - Android - 启动与已知设备的蓝牙连接