如何使用带有某种枚举类型实例的方法创建接口?

时间:2012-05-27 07:45:05

标签: java generics interface enums

我想到了一个接口,它声明了一种方法,用于将原始分数从调查转换为特定类别的百分位值,其中类别由多个不相关的枚举类型描述。所以我从这开始:

public interface NormTable<E extends Enum<E>> {
    Integer percentileForRawScore(E e, int score);
}

然后我得到了一个实施课程,比如Foo调查及其Subscale枚举:

public class FooSubscaleNormTable implements NormTable<Subscale> {
    public Integer percentileForRawScore(Subscale e, int score) {
        // Implementation
    }
}

最后,用于创建适当的具体类的工厂类:

public class NormTableFactory {
    public static <E extends Enum<E>> NormTable<E> normTableForSurveyAndType(
        String surveyCode, Class<E> clazz) {
    if ("Foo".equals(surveyCode) && Subscale.class.equals(clazz)) {
        return (NormTable<E>) new FooSubscaleNormTable();
    } else {
            // ...
        }
    }
}

我怀疑演员是错的,因为Eclipse将其标记为未经检查,但让我继续。但是,构建服务器上的Java 1.6编译器根本不开心,并将它们标记为不可转换的类型。

我是否在工厂类中签名错误,或者我的整个架构看起来是否可疑?我在上面指出,枚举类型“不相关”,尽管它们都代表调查中的类别,并且可以设想实现一个界面来统一它们的类型。那会有帮助吗?

1 个答案:

答案 0 :(得分:2)

您不应在声明类型中使用具体的Enum类。

使FooSubscaleNormTable也是通用的

public class FooSubscaleNormTable<E extends Enum<E>> implements NormTable<E> {
    public Integer percentileForRawScore(E e, int score) {
       if(e instanceof Subscale) {
           switch((Subscale) e) {
           case X:
           // do something
           break;
           }
       }
       // return 0; 
    }
}

并将您的工厂更改为

public class NormTableFactory {
    public static <E extends Enum<E>> NormTable<E> normTableForSurveyAndType(
        String surveyCode, Class<E> clazz) {
    if ("Foo".equals(surveyCode) && Subscale.class.equals(clazz)) {
        return (NormTable<E>) new FooSubscaleNormTable<E>();
    } else {
            // whatever else
        }
    }
}

然后当你调用它时,就是你传入你想要的枚举类型。

NormTable<Subscale> scale = NormTableFactory.normTableForSurveyAndType("surveyCode", Subscale.class);