2014-07-17 2 views
0

목록이 포함 된 클래스가 있습니다. 목록의 항목에는 하위 유형이 있습니다. 이 클래스의 모든 사실에는 동일한 하위 유형이있는 항목의 목록이 포함되기를 기대합니다. 같은 목록에서 오는 모든 항목을 가져와 다른 하위 유형이 있는지 확인하는 규칙을 작성하려고합니다. 다음 시도는 마지막 조건 컴파일에 실패 :Drools 규칙 일치하지 않는 목록 개체에서 가져 오기

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 해결할 수없는 말했습니다을 그 나는 원래 캐스트되지 않습니다에서 키워드로 얻는 아이템 수업. 그러나 나는이 것을 컴파일하려고하지 않고있다. 나는이 문제에 대한 최상의 규칙을 찾고있다.

대단히 감사합니다. .

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

첫 번째 질문 - MyType에 getSubType() 메서드가 있습니까? – Steve

+0

두 번째 질문 - MyType의 목록 인스턴스에있는 개체입니까? 당신은 캐스팅에 대해 이야기하지만, DRL은 MyType에 아무것도 캐스트하지 않습니다. MyType의 인스턴스와 일치합니다. – Steve

+0

규칙 구조는 모든 불평등 쌍마다 활성화됩니다. 즉 [1, 2, 3]의 목록에 대해 [1, 2], [1, 3], [2, 1], [2, 3], [3,1] [3, 2]. 너가 원하는게 그거야? – Steve

답변

1

(용어 "하위 유형이"자바에서 특정 의미를 가지고 다른 용어를 사용하는 것이 좋습니다 것, 예를 들어 "종류 : 여기


는 laune 의견 덕분에 컴파일 버전입니다 ")

사용자가 가지고있는 not은 구문 상 올바르지 않습니다. 자바의 논리적 부정를 사용하는 평가는 작동 할 수 있지만, 여기에 단순히 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 

하지만 스티브가 정확하게 하나의 ListContainer 내에서 서로 다른 값의 각 쌍에 대해 두 번이 화재 댓글을 달았 것처럼.

+0

감사합니다. laune. exist()는 좋은 팁이었습니다. 가독성을 위해 예제를 약간 변경했지만 지금 컴파일됩니다. BTW. 실제 코드가 다른 이름이지만 동일한 오류를 가지고 있기 때문에 subType이 문제가 아니어야합니다. – goth