首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Long to Double in Jexl

Long to Double in Jexl
EN

Stack Overflow用户
提问于 2011-11-26 20:58:38
回答 2查看 1.8K关注 0票数 1

我使用来自apache的Jexl lib,在使用Expression类的evaluate()方法时遇到了一些问题。下面是NelderMead类的代码:

代码语言:javascript
复制
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;
    }
}

测试用例的代码为:

代码语言:javascript
复制
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));

    }

}

当我运行测试用例时,它会导致以下错误:

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-26 21:12:12

这个测试用例应该模拟您的问题。

代码语言:javascript
复制
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);
    }

}

它运行起来没有任何问题。你发布的代码是给你带来异常的代码吗?

下面是经过长修改后的代码

代码语言:javascript
复制
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中的根类。

票数 1
EN

Stack Overflow用户

发布于 2011-11-26 21:01:52

方法的返回类型是double,为什么要将return语句中的结果转换为Long

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8278550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档