定义一些类,这些类之间有父子关系,如下:

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的更多相关文章

  1. Sql中的并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)详解

    UNION 查询选修了180101号或180102号课程或二者都选修了的学生学号.课程号和成绩. (SELECT  学号, 课程号, 成绩 FROM   学习 WHERE   课程号='180101' ...

  2. Check类之duplicate declaration checking/Class name generation/Type Checking

    1.duplicate declaration checking /** Check that variable does not hide variable with same name in * ...

  3. python---Django中模型类中Meta元对象了解

    Django中模型类中Meta元对象了解 1.使用python manage.py shell 进入编辑命令行模式,可以直接进入项目(为我们配置好了环境) python manage.py shell ...

  4. Tomcat是如何将请求一步步传递到我们编写的HttpServlet类中的

    我们平常编写好的HttpServlet类后,就可以处理请求了,但是服务器在接收到请求信息以后是如何将这些请求传递到我们编写的Servlet类中的???这个疑问在我心中的已经很久了,现在要来解决它. 我 ...

  5. 在JBPM的Handle类中调用Spring管理的类

    我们在使用JBPM定义流程的时候经常要在流程定义文件中加入一个继承xxxHandler的类来实现我们的业务逻辑判断或者其他的需求,在这个类中一般都是用Spring的Application来获取,而这种 ...

  6. 编写一个应用程序,在主类Test1类中,创建两个链表List<E>对象,分别存储通过键盘输入的字符串内容

    题目1:编写一个应用程序,在主类Test1类中,创建两个链表List<E>对象,分别存储通过键盘输入的字符串内容--"chen","wang",&q ...

  7. 揭开C++类中虚表的“神秘面纱”

    C++类中的虚表结构是C++对象模型中一个重要的知识点,这里咱们就来深入分析下虚表的在内存中的结构. C++一个类中有虚函数的话就会有一个虚表指针,其指向对应的虚表,一般一个类只会有一个虚表,每个虚表 ...

  8. Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...

  9. Hibernate jpa 在实体类中对于时间的注解

    在时间类型DATE 属性上添加一个 @Temporal(TemporalType.DATE)(精确到年月日)@Temporal(TemporalType.TIME)(精确到时分秒)@Temporal( ...

随机推荐

  1. webUploader上传视频,包括上传进度、上传状态、暂停和取消等

    踩坑视频上传: 点击开始上传: 头部引入webuploader.css <!DOCTYPE html> <html lang="en"> <head& ...

  2. 14)settings.xml

    1. User Level. ${user.home}/.m2/settings.xml 2. Global Level. ${maven.home}/conf/settings.xml <se ...

  3. Java(Android)线程池[转]

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  4. 基于MATLAB的RGB转YCBCR色彩空间转换

    使用MATLAB进行图片的处理十分方便,看它的名字就知道了,矩阵实验室(matrix laboratory).一副图片的像素数据可以看成是一个二维数组一个大矩阵,MTABLAB就是为矩阵运算而生. M ...

  5. underscore utility

    1._.noConflict:命名冲突处理方法 _.noConflict = function() { root._ = previousUnderscore; //返回this不错 return t ...

  6. C# Timer类

    C# 有三种不同的Timer类 1.Threading.Timer 2.Timer.Timer 3.Forms.Timer using System; using System.Collections ...

  7. 同一台服务器配置多个tomcat服务的方法

    要在同一台服务器上配置多个tomcat服务,需要解决以下几个问题 (1) 不同的tomcat启动和关闭监听不同的端口 (2) 不同的tomcat的启动文件startup.sh 中要指定各自的CATAL ...

  8. LeetCode149:Max Points on a Line

    题目: Given n points on a 2D plane, find the maximum number of points that lie on the same straight li ...

  9. DBCC--CHECKIDENT

    检查活或重置自增键的标识值,可以使用NORESEED 来检查当前标识值和标识列在表中的最大值. 如果当前标识值与表中数据冲突或希望将标识值重置到一个较小的值时,可以只用RESEED 来设置 DBCC ...

  10. SmartUpload工具上传文件步骤

    上传文件的步骤1.实例化SmartUpLoad实例    SmartUpload smart = new SmartUpload();2.初始化上传操作    ServletConfig config ...