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

Methods Jess和重载Java静态方法的调用,methods,static,call,jess,Methods,Static,Call,Jess,我从Jess调用重载函数时遇到一些问题,得到了意外的结果,有时出现异常。结果不太可预测。除其他外,它们似乎取决于有多少重载函数 是否有可靠的方法确保调用正确的函数?任何反馈都将不胜感激。请耐心点,因为这会有点长 我有以下中电: (deffunction functionShort (?a1 ?a2 ?a3) (JessOverLoaded.function ?a1 ?a2 ?a3)) (deffunction functionInteger (?a1 ?a2 ?a3) (JessOverLo

我从Jess调用重载函数时遇到一些问题,得到了意外的结果,有时出现异常。结果不太可预测。除其他外,它们似乎取决于有多少重载函数

是否有可靠的方法确保调用正确的函数?任何反馈都将不胜感激。请耐心点,因为这会有点长

我有以下中电:

(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静态方法:

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)  
(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))  
以下调用最终都调用了长版本的
函数(Long,Long,Long)
。 我希望通过将Java对象传递给Jess,它可以选择适当的方法来调用

(functionInteger (FunctionsObjectCreator.createInteger)(FunctionsObjectCreator.createInteger) (FunctionsObjectCreator.createInteger))  
(functionShort (FunctionsObjectCreator.createShort)
(FunctionsObjectCreator.createShort) (FunctionsObjectCreator.createShort))  
(functionLong (FunctionsObjectCreator.createLong) (FunctionsObjectCreator.createLong)  (FunctionsObjectCreator.createLong))  
其中
FunctionsObjectCreator.createXYZ()
create Integer、Short和Long对象

下面是另一个重载示例,其主要类为Integer:

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将调用以下一些静态方法:

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)  
(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))  
上述调用要么无法调用正确的静态方法,要么接收异常。其中一个例外是:

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  

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

但是,我对您尚未显示的函数sobjectcreator.createInteger有些怀疑。您是否确保(使用(JavaObjectP))这些方法的结果确实是java对象

尝试使用以下命令调用重载函数:

 (call JessOverLoaded function (new Integer 1)(new Integer 2)(new Integer 3))

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


Jess 8的性能稍好一些,目前还在早期版本中,但仍然不够完美。

你知道Jess变量不是类型化的吗?对于Java编译器来说,这种重载解决方案是不可能在运行时通过Jess与Java的连接来实现的,因为这样会使性能陷入困境。-这种重载的扩展使用有什么理由吗?不幸的是,我必须处理返回Byte、Short、Integer、Long、Float、Double等的Java对象,以及它们的数组[]和[]。Jess有这些方法的内部表示,它必须进行猜测才能找到正确的重载方法。正如您提到的,您必须直接从Jess实例化Integer以获得Integer实例。否则,包装简单Java类型的大多数Java类(如果不是所有的话)如果从Java传递过来,将由Jess自己的表示来表示。。。您可以确保重载解析选择正确的方法。这就是你要问的。