Check类中的incl、union,excl,diff,intersect
定义一些类,这些类之间有父子关系,如下:
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()方法

可能可以这样理解:找ts1与ts2中共同抛出的异常,那么对Father与Son1、Son2来说,可能抛出的共同异常就是Son1和Son2
对于Middle与Top、Bottom来说,
源代码如下:
/** 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类中的incl、union,excl,diff,intersect的更多相关文章
- Sql中的并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)详解
UNION 查询选修了180101号或180102号课程或二者都选修了的学生学号.课程号和成绩. (SELECT 学号, 课程号, 成绩 FROM 学习 WHERE 课程号='180101' ...
- Check类之duplicate declaration checking/Class name generation/Type Checking
1.duplicate declaration checking /** Check that variable does not hide variable with same name in * ...
- python---Django中模型类中Meta元对象了解
Django中模型类中Meta元对象了解 1.使用python manage.py shell 进入编辑命令行模式,可以直接进入项目(为我们配置好了环境) python manage.py shell ...
- Tomcat是如何将请求一步步传递到我们编写的HttpServlet类中的
我们平常编写好的HttpServlet类后,就可以处理请求了,但是服务器在接收到请求信息以后是如何将这些请求传递到我们编写的Servlet类中的???这个疑问在我心中的已经很久了,现在要来解决它. 我 ...
- 在JBPM的Handle类中调用Spring管理的类
我们在使用JBPM定义流程的时候经常要在流程定义文件中加入一个继承xxxHandler的类来实现我们的业务逻辑判断或者其他的需求,在这个类中一般都是用Spring的Application来获取,而这种 ...
- 编写一个应用程序,在主类Test1类中,创建两个链表List<E>对象,分别存储通过键盘输入的字符串内容
题目1:编写一个应用程序,在主类Test1类中,创建两个链表List<E>对象,分别存储通过键盘输入的字符串内容--"chen","wang",&q ...
- 揭开C++类中虚表的“神秘面纱”
C++类中的虚表结构是C++对象模型中一个重要的知识点,这里咱们就来深入分析下虚表的在内存中的结构. C++一个类中有虚函数的话就会有一个虚表指针,其指向对应的虚表,一般一个类只会有一个虚表,每个虚表 ...
- Python类中super()和__init__()的关系
Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...
- Hibernate jpa 在实体类中对于时间的注解
在时间类型DATE 属性上添加一个 @Temporal(TemporalType.DATE)(精确到年月日)@Temporal(TemporalType.TIME)(精确到时分秒)@Temporal( ...
随机推荐
- org.springframework spring-test
需要的jar包 <dependency> <groupId>org.springframework</groupId> <artifactId>spri ...
- (线段树) Count the Colors --ZOJ --1610
链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82832#problem/F http://acm.zju.edu.cn/onli ...
- (连通图 Tarjan)Caocao's Bridges --HDU --4738
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:曹操有很多岛屿,然后呢需要建造一些桥梁将所有的岛屿链接起来,周瑜要做的是就是不让曹操将所 ...
- oracle数据库查询日期sql语句(范例)、向已经建好的表格中添加一列属性并向该列添加数值、删除某一列的数据(一整列)
先列上我的数据库表格: c_date(Date格式) date_type(String格式) 2011-01-01 0 2012-03-07 ...
- Java反射reflection与注解annotation的应用(自动测试机)
一.关于自动测试机 1.什么是自动测试机? 对类中的指定方法进行批量测试的工具 2.自动测试机有什么用? a.避免了冗长的测试代码 当类中的成员方法很多时,对应的测试代码可能会很长,使用测试能够让测试 ...
- EasyUi 合并单元格占列显示
$("#TableContainer").datagrid({ url: '', method: "get&q ...
- K8S+GitLab-自动化分布式部署ASP.NET Core(三) 更新镜像版本并部署到K8S上
一.介绍 前一篇,介绍了ASP.NET Core部署到K8S上,下面介绍我们在发布新一版本中怎么通过Gitlab CI自动给镜像打版本并部署到K8S上. 二.我们通过GitLab CI/CD 变量 不 ...
- 第七章 ReentrantLock总结
常用方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final ReentrantLo ...
- 900. RLE Iterator
Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...
- jzoj100031
這題是結論題 好玄學,不懂 代碼: #include<bits/stdc++.h> using namespace std; struct no{ int v,p; bool operat ...