Java 如何访问另一个类的枚举类型?是否有方法将字符串(映射键)用作预期为Enum<;的方法的参数&燃气轮机;类型?

Java 如何访问另一个类的枚举类型?是否有方法将字符串(映射键)用作预期为Enum<;的方法的参数&燃气轮机;类型?,java,enums,classcastexception,Java,Enums,Classcastexception,如果有人能指出我做错了什么,我将不胜感激 我有一个接口IDoubleSource,我在Person类中实现它。有一个LinearRegression类,其方法采用IDoubleSource参数,但我将传入Person类 作为IDoubleSource接口的一部分,必须定义名为Variables的枚举和名为getDoubleValue(enum)的方法。下面,我将展示我是如何亲自完成这项工作的,并且使用枚举类型在getDoubleValue()方法中指定开关情况 问题是: 1) 在LinearRe

如果有人能指出我做错了什么,我将不胜感激

我有一个接口IDoubleSource,我在Person类中实现它。有一个LinearRegression类,其方法采用IDoubleSource参数,但我将传入Person类

作为IDoubleSource接口的一部分,必须定义名为Variables的枚举和名为getDoubleValue(enum)的方法。下面,我将展示我是如何亲自完成这项工作的,并且使用枚举类型在getDoubleValue()方法中指定开关情况

问题是: 1) 在LinearRegression中,有一种方法computeScore((MultiKeyCovercient)Map,IDoubleSource),其中最后一个参数是接口。我似乎无法在computeScore方法中访问IDoubleSource实现实例的变量枚举,尽管已将接口导入LinearRegression类。它只是没有注册IDoubleSource有一个名为Variables的枚举(尽管我可以调用getDoubleValue()方法)。是否有任何明显的错误,阻止我访问枚举变量

2) Person类中的getDoubleValue(Enum)方法旨在返回一个双精度值,该值取决于传递给它的枚举变量的值。通过在LinearRegression类中的(MultiKeyCourtifier)映射的键(字符串类型)之间循环,我希望使用这些键来指定要作为LinearRegression类中getDoubleValue(enum)的参数的枚举值(我希望getDoubleValue()根据循环中接收到的枚举值返回多个不同的值)。但是,我无法使用(String)键代替预期的枚举,因为我得到一个ClassCastException java.lang.String不能转换为java.lang.enum。如何使用映射的键指定枚举

我不太熟悉在Java中使用枚举类型,这可能是我的问题的很大一部分

现在,代码详细信息如下:

我实现了以下接口:

IDOUBLESOURCE接口
公共接口IDoubleSource{
公共枚举变量{
违约
}
/**
*返回与给定variableID对应的双精度值
*@param variableID变量的唯一标识符。
*@返回所需变量的当前双精度值。
*/
公共双getDoubleValue(枚举变量ID);
}

通过创建类:

人类
公共类Person实现IDoubleSource{
公共枚举变量{
孩子们,
持续时间不耦合,
年龄差异;
}
公众人士(){
...
}
公共双精度getDoubleValue(枚举变量ID){
开关((变量)variableID){
儿童个案:
返回getNChildren();
案例持续时间解耦:
return(double)getDurationIn耦();
案例年龄差异:
返回getAgeDiff();
违约:
抛出新的IllegalArgumentException(“不支持的变量”);
}

在另一个包中,我有一个类:

线性回归类
公共类线性回归
私有MultiKeyCoefficientMap=null;
公共线性回归(MultiKeyCoefficientMap){
this.map=map;
}
....
公共双倍分数(IDoubleSource iDblSrc){
返回computeScore(map,iDblSrc);
}   
公共静态双计算核心(MultiKeyCoefficientMap coeffMap,IDOLSource iDblSrc){
试一试{
final Map varMap=new HashMap();
对于(对象多键:coeffMap.keySet())
{
最后一个字符串键=(字符串)((多键)多键).getKey(0);
Enum keyEnum=(Enum)key;//引发类强制转换异常
double value=iDblSrc.getDoubleValue(keyEnum);
varMap.put(键,值);
}
返回computeScore(coeffMap,varMap);
}捕获(IllegalArgumentException e){
System.err.println(e.getMessage());
返回0;
}
}
}
公共静态双计算核心(MultiKeyCoefficientMap amap,映射值)
{
//做点什么
}
我非常感谢您花时间通读了这段代码。如果您知道我做错了什么,请一定告诉我

非常感谢并致以最良好的祝愿


R

您的关键错误假设是,
IDoubleSource.Variables
enum以某种方式连接到
Person.Variables
enum。它们完全不相关。(它们恰好有相同的简单名称。)

当一个类(如
Person
)实现一个接口(如
IDoubleSource
)时,该类声明它将提供(非
默认值
)的实现该接口中的方法。已实现接口中的任何内部类、内部枚举或内部接口都是相关的,如果它们出现在必须实现的接口方法之一的签名中

因此,您可以将界面更改为:

public interface IDoubleSource {
    public enum Variables {
        Default;
    }

    public double getDoubleValue(Variables variableID);
}
…但是传递给的任何实现的唯一合法值是
默认值--
IDoubleSource的实现者不能扩展允许的枚举值集

我认为您真正想做的是声明
IDoubleSource
的实现者必须声明他们处理的枚举类型:

public interface IDoubleSource<T extends Variables & Enum<T>> {
    public interface Variables { }

    public double getDoubleValue(T variableID);
}
最后一个技巧是增强
computeScore
方法的签名,以确保
iDblSrc
参数使用与映射中相同的枚举类型:

public static <T extends IDoubleSource.Variable & Enum<T>>
double computeScore(MultiKeyCoefficientMap<T,?> coeffMap,
                    IDoubleSource<T> iDblSrc);
公共静态
双重计算核心(MultiKeyCoefficientMap coeffMap,
i双源iDblSrc);
那么地图中的键就不会是
String
sa了
public interface IDoubleSource {
    public enum Variables {
        Default;
    }

    public double getDoubleValue(Variables variableID);
}
public interface IDoubleSource<T extends Variables & Enum<T>> {
    public interface Variables { }

    public double getDoubleValue(T variableID);
}
public class Person implements IDoubleSource<PersonVariables> {
    public enum PersonVariables implements Variables {
            nChildren,
            durationInCouple,       
            ageDiff;
    }

    public double getDoubleValue(PersonVariables variableID) {
        switch (variableID) { //no cast necessary here!
        case nChildren:
            // ...
        default:
            // this is now really impossible
            // if the rest of your program has no unsafe casts
            throw new IllegalArgumentException("Unsupported variable");
        }
    }
}
public static <T extends IDoubleSource.Variable & Enum<T>>
double computeScore(MultiKeyCoefficientMap<T,?> coeffMap,
                    IDoubleSource<T> iDblSrc);