我正在处理在Drools中扩展公共基类的消息,对于一个类型,我需要在规则条件中为变量定义调用不同的getter。对于异常和所有其他类,值都是 int ,但getter名称不同。否则规则完全相同,这就是为什么我试图在一个规则中解决它。
public class ClassBase {
private int baseVal = 42;
public int getBaseVal() {
return baseVal;
}
}
public class ClassA extends ClassBase {
private int myVal = 42;
public int getAval() {
return myVal;
}
}
public class ClassB extends ClassBase {
private int myVal = 42;
public int getBval() {
return myVal;
}
}
public class SomeClassWithInt {
private int comp = 42;
public int getComp() {
return comp;
}
}
我的目标是使用变量来查找其他事实,并在结果中使用它。
rule "different getter depending on class type"
when
$base: ClassBase()
( ClassB( this == $base, $value: bval ) or
not ClassB( this == $base, $value: baseVal ))
$some: SomeClassWithInt( comp == $value )
then
System.out.println($value);
end
现在,如果我添加一个 ClassA ,一个 ClassB 和一个 SomeClassWithInt ,并调用 fireAllRules()这个规则不开火。如果我用 ClassA(...)替换 not classB(...)部分,它的工作方式就像我想要的那样。
有人可以告诉我为什么不版本不起作用吗?
答案 0 :(得分:1)
经过一番研究后,我找到了解决方案。
rule "Working"
when
$base: ClassBase( )
(ClassB( this == $base, $value : bval ) or
ClassBase( this == $base, $cl : class, $cl != ClassB, $value : baseVal) )
then
// Do something with $value
end
如this comment中所述,我之前尝试过此操作,但没有分配给$cl
这不应该是必要的,但我的版本(它是一个自定义版本,不知道它是基于什么版本)的Drools似乎有一个错误,版本class != ClassB
不起作用。
答案 1 :(得分:0)
显然,满足条件not ClassB(this == $base, $value:baseVal)
意味着$value
仍然未绑定。因此Drools正确拒绝允许您使用此变量。