Java 这个drl应该编译吗?

Java 这个drl应该编译吗?,java,drools,mvel,Java,Drools,Mvel,我正在为一个推广引擎系统运行Drools 5.5的项目工作。在构建知识库时,我在理解编译步骤时遇到了一些问题 情况就是这样:我有一个drl,它在条件size>=int的列表上执行collect LHS。 生成drl的系统出错了,现在出现了运行时异常。现在,我正试图了解本例中的drools编译是如何工作的 问题是,在这个集合上,约束大小>=something,其中something不是整数,drools 5.5编译器不会验证它,异常只会在运行时爆发: $COLLECT_ALL : ArrayLis

我正在为一个推广引擎系统运行Drools 5.5的项目工作。在构建知识库时,我在理解编译步骤时遇到了一些问题

情况就是这样:我有一个drl,它在条件size>=int的列表上执行collect LHS。 生成drl的系统出错了,现在出现了运行时异常。现在,我正试图了解本例中的drools编译是如何工作的

问题是,在这个集合上,约束大小>=something,其中something不是整数,drools 5.5编译器不会验证它,异常只会在运行时爆发:

$COLLECT_ALL : ArrayList (size >= something)
    from collect ( Product ( ... ) )
但是,相同的代码在drools 5.0.0上进行了验证,我能够在创建知识库之前删除此规则

我不知道这是一个错误还是仅仅是对口水上的LHS的误解

无论如何,这是我正在进行的验证步骤

 KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
 builder.add(ResourceFactory.newByteArrayResource(rule.getBytes()) , ResourceType.DRL);
 if (builder.hasErrors()) {
    createErrorMessage(builder);
 }

DRL解析器在5.0.0之后进行了一系列的改进,然后在IIRC 5.2和5.3之间进行了全面的重新设计

为了理解ArrayListsize>=5.5中的某个东西在编译时和运行时会发生什么,我们必须知道它是什么。对所有内容的完整讨论都超出了范围,但是,根据经验,如果表达式是有效的Java,那么它应该在运行时编译,而不是抱怨、隆隆或翻滚——更不用说爆炸了——希望它不会损坏内核

后来

原因是在开发过程中的某个地方已经做出了区分,没有将类型安全性应用于集合,而所有其他类在默认情况下都是类型安全的,这意味着编译时检查

您可以使用(例如)for ArrayList将其添加到您的DRL文件来启用此功能:

declare ArrayList
@typesafe( true )
end

从技术上讲,它不是有效的java语句。有些事真的很重要。我知道这听起来很奇怪,但这只是文件中的一个词。看起来像一个变量,但从未声明过。示例:规则XYZ当$COLLECT\u ALL:ArrayList size>=标记XYZ from COLLECT Product。。。然后谢谢你的澄清似乎有一个不同的w.r.t.错误报告。产品中的类似错误在编译时被标记。我正在Drools用户列表中查找这个问题。请参阅我答案中的添加内容。谢谢!我试过了,现在编译器正在抱怨: