我使用来自apache的Jexl lib,在使用Expression类的evaluate()方法时遇到了一些问题。下面是NelderMead类的代码:
import org.apache.commons.jexl2.*;
public class NelderMead {
// контсанты
private static int M = 3;
private static double E = 0.005;
private static double A = 1.000;
private static double B = 0.500;
private static double Y = 2.000;
// переменные
private JexlEngine jexl;
private Expression func;
private String funcString = "";
private MapContext[] iterations;
public NelderMead(){
this.jexl = new JexlEngine();
}
public NelderMead(String funcString){
this.jexl = new JexlEngine();
this.setFunc(funcString);
}
public void setFunc(String funcString){
this.funcString = funcString;
this.func = this.jexl.createExpression(funcString);
}
public double funcEval(MapContext args){
return ((Double) this.func.evaluate(args)).doubleValue();
}
public boolean checkCriterian(){
return true;
}
}测试用例的代码为:
import org.apache.commons.jexl2.MapContext;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
NelderMead nm = new NelderMead("(x1-2)^4+(x1-2*x2)^2");
MapContext mc = new MapContext();
mc.set("x1", 2);
mc.set("x2", 1);
System.out.println(nm.funcEval(mc));
}
}当我运行测试用例时,它会导致以下错误:
Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
at NelderMead.funcEval(NelderMead.java:33)
at Test.main(Test.java:14)我不明白为什么它不能双倍施法?
PS
Here是evaluate()函数的javadoc。
发布于 2011-11-26 21:12:12
这个测试用例应该模拟您的问题。
package com.sg2net.test;
public class TestCast {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestCast tc= new TestCast();
tc.funcEval();
}
public double funcEval(){
return ((Long) eval()).doubleValue();
}
private Object eval() {
return new Long(1);
}
}它运行起来没有任何问题。你发布的代码是给你带来异常的代码吗?
下面是经过长修改后的代码
import org.apache.commons.jexl2.*;
public class NelderMead {
// контсанты
private static int M = 3;
private static double E = 0.005;
private static double A = 1.000;
private static double B = 0.500;
private static double Y = 2.000;
// переменные
private JexlEngine jexl;
private Expression func;
private String funcString = "";
private MapContext[] iterations;
public NelderMead(){
this.jexl = new JexlEngine();
}
public NelderMead(String funcString){
this.jexl = new JexlEngine();
this.setFunc(funcString);
}
public void setFunc(String funcString){
this.funcString = funcString;
this.func = this.jexl.createExpression(funcString);
}
public double funcEval(MapContext args){
return ((Long) this.func.evaluate(args)).doubleValue();
}
public boolean checkCriterian(){
return true;
}
}它运行起来没有任何问题。evaluate函数返回一个Long,它是一个对象。evaluate函数可以返回任何类,因为Object是Java中的根类。
发布于 2011-11-26 21:01:52
方法的返回类型是double,为什么要将return语句中的结果转换为Long?
https://stackoverflow.com/questions/8278550
复制相似问题