4、isSameType() 方法

  /**
     * Is t the same type as s?
     */
    public boolean isSameType(Type t, Type s) {
        return isSameType.visit(t, s);
    }  

会对t为各种类型进行单独判断,下面来具体阐述。

(1)t为Type类型

public Boolean visitType(Type t, Type s) {
            if (t == s)
                return true;

            if (s.tag >= firstPartialTag)
                return visit(s, t);

            switch (t.tag) {
            case BYTE: case CHAR: case SHORT: case INT: case LONG: case FLOAT:
            case DOUBLE: case BOOLEAN: case VOID: case BOT: case NONE:
                return t.tag == s.tag;
            case TYPEVAR: {
                if (s.tag == TYPEVAR) {
                    //type-substitution does not preserve type-var types
                    //check that type var symbols and bounds are indeed the same
                    return t.tsym == s.tsym &&
                            visit(t.getUpperBound(), s.getUpperBound());
                }
                else {
                    //special case for s == ? super X, where upper(s) = u
                    //check that u == t, where u has been set by Type.withTypeVar
                    return s.isSuperBound() &&
                            !s.isExtendsBound() &&   // 这样可以确保为 ? super X 而不是?
                            visit(t, upperBound(s)); // 判断t是否为upperBound(s)的子类
                }
            }
            default:
                throw new AssertionError("isSameType " + t.tag);
            }
}

(2)t为visitClassType类型

@Override
public Boolean visitClassType(ClassType t, Type s) {
            if (t == s)
                return true;

            if (s.tag >= firstPartialTag)
                return visit(s, t);

            if (s.isSuperBound() && !s.isExtendsBound())
                return visit(t, upperBound(s)) && visit(t, lowerBound(s));

            if (t.isCompound() && s.isCompound()) {
                if (!visit(supertype(t), supertype(s)))
                    return false;

                HashSet<SingletonType> set = new HashSet<SingletonType>();
                for (Type x : interfaces(t))
                    set.add(new SingletonType(x));
                for (Type x : interfaces(s)) {
                    if (!set.remove(new SingletonType(x)))
                        return false;
                }
                return (set.isEmpty());
            }
            return t.tsym == s.tsym
                && visit(t.getEnclosingType(), s.getEnclosingType())
                && containsTypeEquivalent(t.getTypeArguments(), s.getTypeArguments());
}

(2)t为visitArrayType类型  

@Override
public Boolean visitArrayType(ArrayType t, Type s) {
            if (t == s)
                return true;

            if (s.tag >= firstPartialTag)
                return visit(s, t);

            return s.tag == ARRAY
                && containsTypeEquivalent(t.elemtype, elemtype(s));
}

(3)t为visitForAll类型

  @Override
        public Boolean visitForAll(ForAll t, Type s) {
            if (s.tag != FORALL)
                return false;

            ForAll forAll = (ForAll)s;
            return hasSameBounds(t, forAll) &&
                    visit(t.qtype, subst(forAll.qtype, forAll.tvars, t.tvars));
        }

  

(4)t为visitUndetVar类型  

  @Override
        public Boolean visitUndetVar(UndetVar t, Type s) {
            if (s.tag == WILDCARD)
                // FIXME, this might be leftovers from before capture conversion
                return false;

            if (t == s || t.qtype == s || s.tag == ERROR || s.tag == UNKNOWN)
                return true;

            if (t.inst != null)
                return visit(t.inst, s);

            t.inst = fromUnknownFun.apply(s);
            for (List<Type> l = t.lobounds; l.nonEmpty(); l = l.tail) {
                if (!isSubtype(l.head, t.inst))
                    return false;
            }
            for (List<Type> l = t.hibounds; l.nonEmpty(); l = l.tail) {
                if (!isSubtype(t.inst, l.head))
                    return false;
            }
            return true;
        }

(5)others

Types方法之isSameType-isSuperType-isSubType的更多相关文章

  1. Types方法之upperBound-lowerBound-isUnbounded-containsType

    1.upperBound(Type t)方法 /** * The "rvalue conversion". * The upper bound of most types is t ...

  2. Types方法之isCastable-isConvertible

    5. Conversions and Promotions 5.1. Kinds of Conversion 5.1.1. Identity Conversion 5.1.2. Widening Pr ...

  3. runtime第三部分方法和消息

    接上一篇http://www.cnblogs.com/ddavidXu/p/5924049.html 转载来源http://www.jianshu.com/p/6b905584f536 http:// ...

  4. Runtime 动态加载方法

    动态加载 #import"ViewController.h" #import"Person.h" @interfaceViewController() @end ...

  5. Objective-C Runtime 运行时之三:方法与消息

    基础数据类型 SEL SEL又叫选择器,是表示一个方法的selector的指针,其定义如下: typedef struct objc_selector *SEL; objc_selector结构体的详 ...

  6. Objective-C Runtime 运行时之三:方法与消息(转载)

    前面我们讨论了Runtime中对类和对象的处理,及对成员变量与属性的处理.这一章,我们就要开始讨论Runtime中最有意思的一部分:消息处理机制.我们将详细讨论消息的发送及消息的转发.不过在讨论消息之 ...

  7. iOS运行时使用(动态添加方法)

    1 举例  我们实现一个Person类 然后Person 其实是没得对象方法eat:的 下面调用person的eat方法 程序是会奔溃的 那么需要借助运行时动态的添加方法 Person *p = [[ ...

  8. 快速上手Runtime(四)之动态添加方法

    如果一个类方法非常多,加载类到内存的时候也比较耗费资源,可以使用动态给某个类,添加方法解决.做到优化内存,节省资源的效果. // // Person.m // ResolveInstanceMetho ...

  9. iOS---runtime介绍

    本文目录 1.Runtime简介 2.Runtime相关的头文件 3.技术点和应用场景 3_1.获取属性\成员变量列表 3_2.交换方法实现 3_3.类\对象的关联对象,假属性 3_4.动态添加方法, ...

随机推荐

  1. Vivado安装教程

    Vivado的各个版本的安流程其实都差不多,本教程用Vivado2016.4为例进行安装,同样适用于之前和之后的各个版本. 下载好安装包后打开,双击xsetup.exe运行安装程序 弹出的窗口,提示现 ...

  2. shell 脚本 实现随机数

    现在我想要1~39之间的随机数该怎么做呢? date +%N   显示当前时间的纳秒   可以把这个数用来做随机数 但我只想要1~39的随机数,该怎么办呢 #! /bin/bash # echo $( ...

  3. PHP 实现简单搜索功能

    方案:问答搜索 1. 搜索结果列表,高亮显示搜索关键词内容 2. 用户输入内容,点击搜索        2.1 获取用户的搜索内容:        2.2 调用分词服务,获取对搜索内容的分词:     ...

  4. Android-XML与JSON的理解-JSON的数据格式

    据我了解,在多年以前浏览器客户端和服务器它们的通讯数据交互格式是XML, 使用XML来规定数据格式可读性确实非常强,XML的魅力确实很大,也很成熟,但是也有不足之处,就是在网络传输的时候对流量要求特别 ...

  5. Android-无序广播

    在之前的博客,Android-广播概念,中介绍了(广播和广播接收者)可以组件与组件之间进行通讯,有两种类型的广播(无序广播 和 有序广播),这篇博客就来讲解无序广播的代码实现: 无序广播:接收者 同时 ...

  6. pro2

    #include<iostream> double sum(int n,dounle[]) {  double  array[100]; foe(int i=0;i<100;i++; ...

  7. Centos 下安装tomcat多实例

    基础环境及JDK就不多说了,下面的目录结构以如下为准: 根目录-apps根目录-apps--tomcat根目录-apps--ins1根目录-apps--ins2 =================== ...

  8. 存储系统的基本数据结构之一: 跳表 (SkipList)

    在接下来的系列文章中,我们将介绍一系列应用于存储以及IO子系统的数据结构.这些数据结构相互关联又有着巨大的区别,希望我们能够不辱使命的将他们分门别类的介绍清楚.本文为第一节,介绍一个简单而又有用的数据 ...

  9. sql-修改每条数据的某一个字段的值

    update B set B.maildata =(select SUBSTRING(maildata,0,3) from basedata where basedata.cid = B.cid)+( ...

  10. H - Graphics(dfs)

    H - Graphics   Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Submi ...