1

apache の Jexl lib を使用していますがevaluate()、Expression クラスのメソッドの使用に問題があります。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)

Double にキャストできない理由がわかりません。

PS

ここに evaluate() 関数の javadoc があります。

4

2 に答える 2

1

このテストケースはあなたの問題を模倣するはずです

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;
    }
}

問題なく動作します。評価関数は、オブジェクトであるLongを返します。ObjectはJavaのルートクラスであるため、evaluate関数は任意のクラスを返すことができます。

于 2011-11-26T13:12:11.920 に答える
0

メソッドの戻り値の型は、ステートメントの結果を?doubleにキャストする理由です。returnLong

于 2011-11-26T13:01:52.273 に答える