0

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

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 编译器并不满意,并将它们标记为不可转换的类型。

我是不是把工厂类的签名弄错了,还是我的整个架构看起来很可疑?我在上面注意到枚举类型是“否则不相关的”,尽管它们都代表调查中的类别,并且可以想象实现一个接口来统一它们的类型。那会有帮助吗?

4

1 回答 1

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);
于 2012-05-27T07:58:02.173 回答