gpt4 book ai didi

java - 如何使用采用某些枚举类型实例的方法创建接口(interface)?

转载 作者:行者123 更新时间:2023-12-02 07:46:29 26 4
gpt4 key购买 nike

我想到了一个接口(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com