论坛首页 Java企业应用论坛

发布新版IK-Expression开源表达式解析器V2.0.5

浏览 11208 次
精华帖 (3) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-08-25  
函数不能重载,所以将函数参数变成Object时,出现----参数类型不匹配,函数类型为:java.lang.Object 传入参数类型为:double
0 请登录后投票
   发表时间:2009-08-25  
lovit 写道
函数不能重载,所以将函数参数变成Object时,出现----参数类型不匹配,函数类型为:java.lang.Object 传入参数类型为:double


你把函数的参数声明成Object,那么参数就是用Object传入就好了。重载的时候,null型没法处理啊,不知道转成啥
0 请登录后投票
   发表时间:2009-08-25  
我现在就是将参数声明成Object,但传入double类型的时候(因为有时候是integer的),就出现上面的错误。。这种情况怎么处理?谢谢!!
0 请登录后投票
   发表时间:2009-08-25  
lovit 写道
我现在就是将参数声明成Object,但传入double类型的时候(因为有时候是integer的),就出现上面的错误。。这种情况怎么处理?谢谢!!


你传入double的时候,变量申明为啥类型啊?
0 请登录后投票
   发表时间:2009-09-03  
linliangyi2007 写道
lovit 写道
我现在就是将参数声明成Object,但传入double类型的时候(因为有时候是integer的),就出现上面的错误。。这种情况怎么处理?谢谢!!


你传入double的时候,变量申明为啥类型啊?

是double类型。也就是说,我有一个函数,定义成Object的参数,IK-Expression下调用时将double类型传入调用的时候,会执行不成功,正常的代码,这个语法应该是支持的。
function void dd(Object a,Object b){

}

double c=0.0;
double d=1.0;

dd(c,d)
0 请登录后投票
   发表时间:2009-09-03  
lovit 写道
linliangyi2007 写道
lovit 写道
我现在就是将参数声明成Object,但传入double类型的时候(因为有时候是integer的),就出现上面的错误。。这种情况怎么处理?谢谢!!


你传入double的时候,变量申明为啥类型啊?

是double类型。也就是说,我有一个函数,定义成Object的参数,IK-Expression下调用时将double类型传入调用的时候,会执行不成功,正常的代码,这个语法应该是支持的。
function void dd(Object a,Object b){

}

double c=0.0;
double d=1.0;

dd(c,d)


是的,你必须把变量声明称Object跟你在函数声明的时候一致。我不知道你的“正常代码这个语法应该是支持”是啥意思,IK-Exp只是一个很轻量级的解析器,它有自己的语法,并不兼容某种语言的,如果你觉得要支持JS或者Java的全部语法,那就期望太高了。你可以看看IK-Exp的项目定位和说明吧。
0 请登录后投票
   发表时间:2009-09-05  
linliangyi2007 写道
lovit 写道
linliangyi2007 写道
lovit 写道
我现在就是将参数声明成Object,但传入double类型的时候(因为有时候是integer的),就出现上面的错误。。这种情况怎么处理?谢谢!!


你传入double的时候,变量申明为啥类型啊?

是double类型。也就是说,我有一个函数,定义成Object的参数,IK-Expression下调用时将double类型传入调用的时候,会执行不成功,正常的代码,这个语法应该是支持的。
function void dd(Object a,Object b){

}

double c=0.0;
double d=1.0;

dd(c,d)


是的,你必须把变量声明称Object跟你在函数声明的时候一致。我不知道你的“正常代码这个语法应该是支持”是啥意思,IK-Exp只是一个很轻量级的解析器,它有自己的语法,并不兼容某种语言的,如果你觉得要支持JS或者Java的全部语法,那就期望太高了。你可以看看IK-Exp的项目定位和说明吧。

我的意思是,在eclipse的JAVA环境下,语法检查和编译都可以通过。其实这个功能比较实用,因为在流程条件判断方面,很难确定这个值是整形或浮点形(因为每个单据的业务数据不同),而IK-Exp又不支持重载,如果当IK-Exp要调用的函数参数为Object类型能支持的话,那就太好了,不知道这个功能能不能实现,谢谢!
0 请登录后投票
   发表时间:2009-09-05   最后修改:2009-09-05
引用

我的意思是,在eclipse的JAVA环境下,语法检查和编译都可以通过。其实这个功能比较实用,因为在流程条件判断方面,很难确定这个值是整形或浮点形(因为每个单据的业务数据不同),而IK-Exp又不支持重载,如果当IK-Exp要调用的函数参数为Object类型能支持的话,那就太好了,不知道这个功能能不能实现,谢谢!


不是太明白你的意思,个人觉得你没有很细的看IK-Exp的API文档。不多说了,这个给一个Object为参数的例子吧:

1.定义自己的Java方法

/**
 * @author linly
 *
 */
public class TestFunctions {
	/**
	 * 自己定义的以Object为参数的Java方法
	 * @param o
	 * @return
	 */
	public String sayHello(Object o){
		if(o instanceof Integer){
			return "Integer";
		}else if(o instanceof Double){
			return "Double";
		}else{
			return "Float";
		}
	}
}



2.设置IKExpression.cfg.xml,将自定义的方法声明为IK-Exp的函数
<?xml version="1.0" encoding="UTF-8"?>
<function-configuration>
        <!-- 这里省略IK-Exp的内置函数配置罗干。。。-->

	
	<!-- 用户函数配置  请在这里定制您自己的函数-->

	<bean class="org.wltea.expression.test.TestFunctions">
		<function name="问好" method="sayHello">
			<parameter-type>java.lang.Object</parameter-type>
		</function>
	</bean>
</function-configuration>



3.在Java中调用的自己写的函数,实现Object的参数传入
	public static void main(String[] args){

		//定义表达式		
		String expression = "$问好(数字类型)";

		//给表达式中的变量 [数字类型] 付上下文的值
		List<Variable> variables = new ArrayList<Variable>();
		variables.add(new Variable("数字类型" , DataType.DATATYPE_OBJECT , new Integer(100)));

		//执行表达式
		Object result = ExpressionEvaluator.evaluate(expression, variables);
		System.out.println("Result = " + result);
		
                //变更 [数字类型] 的值
		variables.add(new Variable("数字类型" , DataType.DATATYPE_OBJECT , new Double(100)));
		//再次执行表达式
		result = ExpressionEvaluator.evaluate(expression, variables);
		System.out.println("Result = " + result);		
		
	}		


4.执行结果
Result = Integer
Result = Double



OK!!!
0 请登录后投票
   发表时间:2009-09-05  
谢谢您的回答,
我们是以下方法去调用的,会出错。。

public static void main(String[] args){   
   Object result = null;
    result = ExpressionEvaluator.evaluate("sayHello(1.0)");   
    System.out.println("Result = " + result);   
    result = ExpressionEvaluator.evaluate("sayHello(1)");   
    System.out.println("Result = " + result);     

}   


以上如“sayHello(1.0)”是在流程中的表达式。您的意思是只能通过楼上的方式去调用吗?因为sayHello中的值,是根据数据库中的数据或上下文的中值取得,配置表达式的时候,根本不知道他是什么类型,只知道他是数字(可能是整形,也可能是浮点型)
0 请登录后投票
   发表时间:2009-09-05   最后修改:2009-09-05
lovit 写道
谢谢您的回答,
我们是以下方法去调用的,会出错。。

public static void main(String[] args){   
   Object result = null;
    result = ExpressionEvaluator.evaluate("sayHello(1.0)");   
    System.out.println("Result = " + result);   
    result = ExpressionEvaluator.evaluate("sayHello(1)");   
    System.out.println("Result = " + result);     

}   


以上如“sayHello(1.0)”是在流程中的表达式。您的意思是只能通过楼上的方式去调用吗?因为sayHello中的值,是根据数据库中的数据或上下文的中值取得,配置表达式的时候,根本不知道他是什么类型,只知道他是数字(可能是整形,也可能是浮点型)


马上发布修定版本,谢谢你的建议。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics