我有一个包含列表的类。列表中的项目具有子类型。我希望这个类中的每个事实都包含具有相同子类型的项目列表。我正在尝试编写一个规则,该规则可以获取来自同一列表的所有项目,并检查它们是否具有不同的子类型。 以下尝试无法编译最后一个条件:
public class ListContainer {
private List<MyType> myTypes;
//getters-setters-hashcode-equals generated by eclipse
...
}
public class MyType{
private String subType;
//getters-setters-hashcode-equals generated by eclipse
...
}
rule "invalidate inconsistent subtypes"
when
$list: ListContainer($myTypes: myTypes)
$myType1 : MyType() from $myTypes
$myType2 : MyType() from $myTypes
not($myType1.subType == $myType2.subType)
then
//actions
end
编译错误说它无法解析$ myType1.subType 我怀疑使用关键字from获得的项目不会转换为原始类。但是我不是要编译这个,我只是在寻找这个问题的最佳规则。
非常感谢。
这是由于laune评论编译的版本:
rule "invalidate inconsistent subtypes"
when
$list: ListContainer($myTypes: myTypes)
$myType : MyType( $subType: subType ) from $myTypes
exists MyType( subType != $subType ) from $myTypes
then
//actions
end
答案 0 :(得分:1)
(术语“子类型”在Java中具有特定含义。最好使用另一个术语,例如“kind”。)
你拥有的not
在语法上是不正确的。使用Java的逻辑否定的eval可能有效,但这里只是确定ListContainer是否具有不同MyType.subType值的列表的版本:
rule "invalidate inconsistent subtypes"
when
$list: ListContainer($myTypes: myTypes)
MyType( $st0: subType ) from $myTypes.get( 0 )
exists MyType( subType != $st0 ) from $myTypes
then
System.out.println( "mismatch " + $st0 );
end
有多少不同的值,它们在哪里是另一回事。
这是您的版本,已更正:
rule "invalidate inconsistent subtypes"
when
$list: ListContainer($myTypes: myTypes)
$mt1: MyType( $st1: subType ) from $myTypes
$mt2: MyType( $st2: subType ) from $myTypes
eval( ! $st1.equals( $st2 ) )
then
System.out.println( "mismatch " + $st1 + " " + $st2 );
end
但正如Steve正确评论的那样,在单个ListContainer中,每对不同的值会触发两次。