首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jess和重载Java静态方法的调用

Jess和重载Java静态方法的调用
EN

Stack Overflow用户
提问于 2013-12-17 06:28:55
回答 2查看 150关注 0票数 1

我在从Jess调用重载函数时遇到了一些问题,得到了意想不到的结果,有时还会出现异常。结果并不是很容易预测。它们似乎取决于有多少个重载函数。

是否有可靠的方法来确保调用正确的函数?任何反馈都将非常感谢。请耐心等待,因为这会有点长。

我有以下中电:

代码语言:javascript
复制
(deffunction functionShort (?a1 ?a2 ?a3) (JessOverLoaded.function ?a1 ?a2 ?a3))  
(deffunction functionInteger (?a1 ?a2 ?a3) (JessOverLoaded.function ?a1 ?a2 ?a3))  
(deffunction functionLong (?a1 ?a2 ?a3) (JessOverLoaded.function ?a1 ?a2 ?a3))  

和Java静态方法:

代码语言:javascript
复制
public static boolean function(Integer arg1, Integer arg2, Integer arg3)  
public static boolean function(Short arg1, Short arg2, Short arg3)  
public static boolean function(Long arg1, Long arg2, Long arg3)   
public static boolean function(Double arg1, Double arg2, Double arg3)  
public static boolean function(Float arg1, Float arg2, Float arg3)  

下面的调用都以调用长版本function(Long, Long, Long)结束。我希望通过将Java对象传递给Jess,它可以选择要调用的适当方法。

代码语言:javascript
复制
(functionInteger (FunctionsObjectCreator.createInteger)(FunctionsObjectCreator.createInteger) (FunctionsObjectCreator.createInteger))  
(functionShort (FunctionsObjectCreator.createShort)
(FunctionsObjectCreator.createShort) (FunctionsObjectCreator.createShort))  
(functionLong (FunctionsObjectCreator.createLong) (FunctionsObjectCreator.createLong)  (FunctionsObjectCreator.createLong))  

其中FunctionsObjectCreator.createXYZ()创建整数、短整型和长整型对象。

下面是另一个使用Integer作为主类的重载示例:

代码语言:javascript
复制
public static boolean inRange(Integer $impliedParameter, Integer lowerBound, Integer upperBound) {  
    System.out.println("inRange Integer 1");  
    return false;  
}  
public static boolean inRange(Integer $impliedParameter, Integer lowerBound, Integer upperBound, Integer[] exclusions) {  
    System.out.println("inRange Integer 2");  
    return false;  
}  
public static boolean inRange(Integer $impliedParameter, Integer[][] listOfRanges, Integer[] exclusions) {  
    System.out.println("inRange Integer 3");  
    return false;  
}  
public static boolean inRange(Integer $impliedParameter, Integer[][] listOfRanges, boolean inclusiveLower, boolean inclusiveUpper, Integer[] exclusions) {  
    System.out.println("inRangeInteger 4");  
    return false;  
}  

为了节省空间,我没有包含String、Short、Long、Date、Character和Byte的重载函数。

clp调用以下一些静态方法:

代码语言:javascript
复制
(deffunction  functionShort1 (?a1 ?a2 ?a3)  
(JessOverLoaded.inRange ?a1 ?a2 ?a3))  

(deffunction  functionInteger1 (?a1 ?a2 ?a3)  
(JessOverLoaded.inRange ?a1 ?a2 ?a3))  

(deffunction  functionLong1 (?a1 ?a2 ?a3)  
(JessOverLoaded.inRange ?a1 ?a2 ?a3))  

(functionInteger1 (FunctionsObjectCreator.createInteger)  (FunctionsObjectCreator.createInteger) (FunctionsObjectCreator.createInteger))  
(functionShort1 (FunctionsObjectCreator.createShort) (FunctionsObjectCreator.createShort)  (FunctionsObjectCreator.createShort))  
(functionLong1 (FunctionsObjectCreator.createLong) (FunctionsObjectCreator.createLong)  (FunctionsObjectCreator.createLong))  

上面的调用要么无法调用正确的静态方法,要么接收到异常。其中一个例外是:

代码语言:javascript
复制
Jess reported an error in routine JessOverLoaded.inRange  
    while executing (JessOverLoaded.inRange ?a1 ?a2 ?a3)  
    while executing deffunction functionInteger1  
    while executing (functionInteger1 (FunctionsObjectCreator.createInteger)   (FunctionsObjectCreator.createInteger) (FunctionsObjectCreator.createInteger)).
  Message: Error during execution.  
  Program text: ( functionInteger1 ( FunctionsObjectCreator.createInteger ) (   FunctionsObjectCreator.createInteger ) ( FunctionsObjectCreator.createInteger ) )  at line  28 in file src/com/softwareag/rules/functions/JessOverloaded.clp.  
    at jess.Funcall.execute(Funcall.java:346)  
    at jess.FuncallValue.resolveValue(FuncallValue.java:29)  
    at jess.Deffunction.call(Deffunction.java:214)  
    at jess.FunctionHolder.call(FunctionHolder.java:35)  
    at jess.Funcall.execute(Funcall.java:338)  
    at jess.Jesp.parseAndExecuteFuncall(Jesp.java:2309)  
    at jess.Jesp.parseExpression(Jesp.java:459)  
    at jess.Jesp.promptAndParseOneExpression(Jesp.java:309)  
    at jess.Jesp.parse(Jesp.java:288)  
    at jess.Batch.batch(Batch.java:132)  
    at jess.Batch.batch(Batch.java:113)  
    at jess.Batch.batch(Batch.java:75)  
    at jess.Batch.batch(Batch.java:40)  
    at jess.Rete.batch(Rete.java:2791)  
    at com.softwareag.rules.functions.parser.JessFunctions.main(JessFunctions.java:18)  
Caused by: java.lang.IllegalArgumentException: Can't convert '64' to required type   [[Ljava.lang.Double;  
    at jess.RU.valueToObject(RU.java:385)  
    at jess.RU.valueToObject(RU.java:289)  
    at jess.SerializableMD.invoke(SerializableMD.java:62)  
    at jess.MethodFunction.call(StaticMemberImporter.java:102)  
    at jess.FunctionHolder.call(FunctionHolder.java:35)  
    at jess.Funcall.execute(Funcall.java:338)  
    ... 14 more  
EN

回答 2

Stack Overflow用户

发布于 2013-12-18 14:11:45

我不能使用每个数值类只有一个参数的简化版本来重现这个问题。

但是,我对您没有展示的FunctionsObjectCreator.createInteger有点怀疑。您是否确保(使用( Java -objectp))这些方法的结果确实是Java对象?

尝试使用例如对重载函数的调用

代码语言:javascript
复制
 (call JessOverLoaded function (new Integer 1)(new Integer 2)(new Integer 3))
票数 0
EN

Stack Overflow用户

发布于 2013-12-19 03:31:59

老实说,如果需要处理这类事情,最简单的方法是编写一个Java类作为适配器;Java类可以重命名重载以消除它们的歧义,因此可以避免整个问题。Jess的重载解决方案可能会在复杂的情况下失效,而且这不太可能完全修复。您会发现其他动态语言也有类似的问题(尽管不可否认,在这方面有些语言比Jess更好)。

它在Jess 8中稍好一些,目前处于早期发布中,但它仍然不是完美的。

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

https://stackoverflow.com/questions/20622244

复制
相关文章

相似问题

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