我想到了一个接口,它声明了一种方法,用于将原始分数从调查转换为特定类别的百分位值,其中类别由多个不相关的枚举类型描述。所以我从这开始:
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编译器根本不开心,并将它们标记为不可转换的类型。
我是否在工厂类中签名错误,或者我的整个架构看起来是否可疑?我在上面指出,枚举类型“不相关”,尽管它们都代表调查中的类别,并且可以设想实现一个界面来统一它们的类型。那会有帮助吗?
答案 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);