作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想到了一个接口(interface),它声明了一种将调查的原始分数转换为特定类别的百分位值的方法,其中类别由多个不相关的枚举类型描述。所以我从这个开始:
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 编译器一点也不高兴,并将它们标记为不可转换的类型。
我在工厂类中的签名是否错误,或者我的整个架构看起来是否可疑?我在上面指出,枚举类型“在其他方面不相关”,尽管它们都代表调查中的类别,并且可以想象实现一个接口(interface)来统一它们的类型。这会有帮助吗?
最佳答案
您不应在声明类型中使用具体的 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);
关于java - 如何使用采用某些枚举类型实例的方法创建接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10772436/
我是一名优秀的程序员,十分优秀!