Check類中的union,excl,diff,intersect
阿新 • • 發佈:2018-08-10
unless empty ext img union 關系 else for ()
定義一些類,這些類之間有父子關系,如下:
class Father{}
class Son1 extends Father{}
class Son2 extends Father{}
class Top{}
class Middle extends Top{}
class Bottom extends Middle{}
1、incl()方法
源代碼如下:
/** Add type set to given type list, unless * it is a subclass of some class in the list. */ public List<Type> incl(Type t, List<Type> ts) { List<Type> result; // 如果t是ts列表中一些類的子類,則返回這個ts if(subset(t,ts)){ result = ts; }else{ // 如果ts列表中有些類是t的子類,則從ts列表中移除這些子類, // 然後追加t後將這個ts列表返回 List<Type> temp = excl(t, ts); result = temp.prepend(t); } return result; }
2、excl()方法
源代碼如下:
/** Remove type set from type set list. */ // 如果ts列表中有些類是t的子類,則從ts列表中移除這些子類後返回, // 如果ts列表為空,表示沒有可移除的或者說已經全部被移除完了, // 直接返回ts空列表 public List<Type> excl(Type t, List<Type> ts) { if (ts.isEmpty()) { return ts; } else { // 需要清楚知道List<Type>這個類型的實現機制 List<Type> ts1 = excl(t, ts.tail); // 遞歸 // 當ts.head是t的子類時,移除這個ts.head,返回ts.tail // 處理後的結果 if (types.isSubtypeCapture(ts.head, t)) { return ts1; } // 當ts.head沒有成為t的子類時,則列表中不需要移除 // 這個ts.head,直接返回ts else if (ts1 == ts.tail) { return ts; } // 當ts.head沒有成為t的子類時且ts.tail處理結果也有變動, // 則追加ts.head到ts1後返回 else { return ts1.prepend(ts.head); } } }
3、並集union()方法
源代碼如下:
/** Form the union of two type set lists. */ public List<Type> union(List<Type> ts1, List<Type> ts2) { List<Type> ts = ts1; for (List<Type> l = ts2; l.nonEmpty(); l = l.tail) { ts = incl(l.head, ts); } return ts; }
4、差集diff()方法
源代碼如下:
/** Form the difference of two type lists.
*/
// 如果ts1列表有些類是ts2列表中某些類的子類,則從ts1
// 列表中移除這些子類,最後返回ts1中剩余的類
public List<Type> diff(List<Type> ts1, List<Type> ts2) {
List<Type> ts = ts1;
for (List<Type> l = ts2; l.nonEmpty(); l = l.tail) {
ts = excl(l.head, ts);
}
return ts;
}
5、交集intersect()方法
源代碼如下:
/** Form the intersection of two type lists.
*/
// 如果有ts1列表中含有Father類型,而ts2中含有Father的
// 子類Sub1,Sub2 時,最終返回Sub1,Sub2,表示這個
// Father類型能夠catch那兩個子類型
public List<Type> intersect(List<Type> ts1, List<Type> ts2) { // todo
List<Type> ts = List.nil();
for (List<Type> l = ts1; l.nonEmpty(); l = l.tail) {
if (subset(l.head, ts2)) {
ts = incl(l.head, ts);
}
}
for (List<Type> l = ts2; l.nonEmpty(); l = l.tail) {
if (subset(l.head, ts1)) {
ts = incl(l.head, ts);
}
}
return ts;
}
Check類中的union,excl,diff,intersect