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( ...
随机推荐
- Apache Struts 2 Documentation Big Picture
http://struts.apache.org/docs/big-picture.html 1. HttpServletRequest 穿越各个过滤器到达FilterDispatcher(这个已经不 ...
- 微信post xml 消息编码问题
site:mp.weixin.qq.com utf 微信卡券接口说明 - 微信公众平台开发者文档 所有API接口POST的数据只支持utf8编码,否则会返回报错. 以上是获取的部分信息 这个尽管有点模 ...
- WPF图形图像相关类
BitmapMetadata类: 继承自抽象类ImageMetadata,包含图像的原数据信息,如相机型号.图像修改程序名称.拍照日期.拍照地点等.ImageSoure类包含ImageMetadata ...
- Blender3d做大型项目真实地形快速建模
https://www.rr-sc.com/thread-16531254-1-1.html Blender3d是一款优秀的动画和建模工具,但在做一些大型建设项目时需要在真实地形上来表现,Blende ...
- The First Android App----Starting Another Activity
To respond to the button's on-click event, open the activity_main.xml layout file and add the androi ...
- [Java]ArrayList集合的contains方法
用到集合ArrayList时经常会用到里面自带的方法boolean contains(Object o);此方法用于判断集合里面是否包含元素o,现在讨论下在Object类型为类类型的时候的情况: cl ...
- java反射中的动态代理机制(有实例)
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- Java实现WordCount
GitHub项目地址:https://github.com/happyOwen/SoftwareEngineering wordcount项目要求: 程序处理用户需求的模式为:wc.exe [para ...
- AME
http://wenku.baidu.com/view/a9dbebc789eb172ded63b7f4.htmlhttp://wenku.baidu.com/view/dde6eb040740be1 ...
- Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付)
http://www.cnblogs.com/devinlee/p/4565933.html Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付) 关注作者 ...