首页
学习
活动
专区
圈层
工具
发布

【Kotlin】泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )

文章目录 一、泛型类 二、泛型参数 三、泛型函数 四、多泛型参数 五、泛型类型约束 一、泛型类 ---- 定义一个 泛型类 , 将 泛型参数 T 放在 尖括号 中 , 该泛型参数放在 类名后..., 主构造函数之前 , 该泛型参数 T 是 类型占位符 , 在 该泛型类类中 可以使用 类型占位符 T 作为一个类 使用 , 可以 定义 T 类型成员属性 主构造函数中可以接收 T 类型的实例对象作为参数..., T 类型可以 作为函数的返回值 ; 通常情况下 , 泛型参数 都使用 T 表示 , 使用其它字母 或者 字符串 都可以表示 泛型参数 , 但是 约定俗成 都使用 T 来表示泛型 ; 代码示例 :...下面的代码中 , 声明了 Student 泛型类 , 该泛型类 接收 T 类型的泛型参数 , 在主构造函数中接收 T 类型的参数 , 在该泛型类中声明了 T 类型的成员属性 ; class Student..., 需要两个泛型参数来表示其类型 ; T 类型在泛型类中注明 , 可以在该泛型类 Student 中随意使用 , 但是 泛型参数 R 是首次在该函数中使用 , 因此需要在该函数的 fun 关键字

4.6K10

【Kotlin】泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )

九、泛型 in 逆变 十、泛型 invariant 不变 十一、泛型逆变协变代码示例 十二、使用 reified 关键字检查泛型参数类型 一、泛型类 ---- 定义一个 泛型类 , 将 泛型参数 T...放在 尖括号 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T 是 类型占位符 , 在 该泛型类类中 可以使用 类型占位符 T 作为一个类 使用 , 可以 定义 T 类型成员属性..., 需要两个泛型参数来表示其类型 ; T 类型在泛型类中注明 , 可以在该泛型类 Student 中随意使用 , 但是 泛型参数 R 是首次在该函数中使用 , 因此需要在该函数的 fun 关键字...(t: T) } 十、泛型 invariant 不变 ---- 在 泛型类 中 , 如果 既将 泛型类型 作为 函数的参数 类型 , 又将 泛型类型 作为 函数的返回值 类型 , 则在 声明 泛型参数..., 泛型参数 是 子类 的 泛型类对象 , 不可以赋值 给 泛型参数 是父类 的变量 ; Java 中的泛型对象赋值 , 不存在继承关系 , 是什么类型就是什么类型 , 类型要严格相同 ; import

5.5K11
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】泛型编程 ⑧ ( 类模板继承语法 | 普通类 继承 类模板语法 | 类模板 继承 类模板语法 | 继承类模板必须指定具体的类型参数列表 | 继承 类模板 必须重写构造函数 )

    的 子类 : // 类模板 继承时 , 需要具体化 类模板 // 也就是 指定 类模板 的 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小..., 类模板子类 与 普通类子类 区别就是 , 类模板子类 需要在尖括号中指定 具体的 类型参数列表 的 数据类型 ; 此时 , 在继承时 , 被继承的 类模板 必须 声明 类型参数列表 , 将具体的泛型类型写在尖括号中...的 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小 // 才能正确分配内存 class Son : public Father 类模板 继承 类模板 时 , 也需要 指定 父类类模板 的具体 泛型类型 , 只是这个泛型类型可以是 另外一个泛型 T ; 下面的代码 是 类模板 继承 类模板的 代码 , Son2...的 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小 // 才能正确分配内存 class Son : public Father<int

    2.7K31

    《探索 C++泛型编程的实现之道》

    它的核心思想是将算法与特定的数据类型分离,使得同一套算法可以应用于不同的数据类型,而无需为每个数据类型都重复编写相同的代码。 这种编程方式带来了诸多好处。首先,它极大地提高了代码的可重用性。...模板 模板是 C++中实现泛型编程的强大工具。它分为函数模板和类模板两种类型。 函数模板:函数模板允许程序员定义一个通用的函数,该函数可以接受不同类型的参数,并对这些参数进行相同的操作。...函数重载 函数重载也是 C++中实现泛型编程的一种方式。函数重载允许程序员定义多个同名的函数,但这些函数的参数列表不同。在函数调用时,编译器会根据实际传入的参数类型自动选择合适的函数版本进行调用。...程序员可以根据自己的需求选择合适的容器类,并在不同的项目中复用这些容器类,而无需为每个数据类型都重新实现容器的功能。 算法 泛型编程也广泛应用于各种算法的实现中。...由于泛型编程可以接受不同类型的参数,所以在使用泛型代码时需要确保传入的参数类型是正确的,否则可能会导致运行时错误。

    25110

    C#相等性 - “==”

    使用 == 判断引用类型的相等性 这里的引用类型不包含string。 看例子,这里我使用==来比较自定义类MyClass的两个实例是否相等: ? 而结果是两个False: ?...我们也可以直接看一下string类的源码,里面也是这样对==进行重载的: ? 当然,重载了==,也需要重载 !=。...这个泛型方法直接报错了,因为==操作符无法应用于这两个操作数T,T可以是任何类型,例如T是非原始类型的struct,那么==就不可用。我们无法为泛型指定约束让其实现某个操作符。...之所以返回了False,是因为泛型方法里的==操作符比较的是引用,而这又是因为尽管编译器知道可以把==操作符应用于类型T,但是它仍然不知道具体是哪个类型T会重载该操作符,所以它会假设T不会重载==操作符...所以泛型方法不会选择任何的操作符重载,它对待泛型类就像对待object类型一样。 综上,针对泛型方法,应该使用Equals()方法,而不是==操作符。 ?

    84020

    假象

    我们也可以直接看一下string类的源码,里面也是这样对==进行重载的: 当然,重载了==,也需要重载 !=。 小结 总结一下,使用==来判断引用类型的相等性,需要按下面的思路顺序进行考虑: 1....泛型 另一种不适合使用==操作符的情景是涉及泛型的时候,直接看例子: 这个泛型方法直接报错了,因为==操作符无法应用于这两个操作数T,T可以是任何类型,例如T是非原始类型的struct,那么==就不可用...我们无法为泛型指定约束让其实现某个操作符。针对这个例子,我可以这样做,来保证可以编译: 现在T是引用类型了,代码可以编译了。...而实际结果是: 之所以返回了False,是因为泛型方法里的==操作符比较的是引用,而这又是因为尽管编译器知道可以把==操作符应用于类型T,但是它仍然不知道具体是哪个类型T会重载该操作符,所以它会假设T...所以泛型方法不会选择任何的操作符重载,它对待泛型类就像对待object类型一样。 综上,针对泛型方法,应该使用Equals()方法,而不是==操作符。

    32810

    1-泛型

    C#泛型类型携带有丰富的元数据,因此C#的泛型类型可以应用于强大的反射技术;采用[基类, 接口, 构造器, 值类型/引用类型]的约束方式来实现对类型参数的"显式约束", 提高了类型的安全性。...但这些成员本身可以包含在泛型类型中,并使用泛型类型的类型参数]; 泛型方法可以包含在泛型类型中,也可以包含在非泛型类型中[即普通的类型]。...泛型方法: public class GenericsMehod { //非泛型类中的泛型方法,参数约束为引用类型 //类型参数将引起编译错误> public int FindItem...,但是之区别类型参数约束的重载是非法的; 也是支持重写的,重写时的类型参数的约束被默认继承,任何的约束的指定都是不必要的,也是不可以指定约束的。...泛型约束支持四种形式的约束【接口约束,基类约束,构造器约束,值类型/引用类型约束】; 约束并不是必须的,如果没有指定约束,那么类型参数将只能访问System.Object类型中的公有方法。

    1.1K100

    C++之类模板的概念学习总结

    一、类模板的引出: 1、在c++中是否能够将泛型的思想应用在类上呢? 我们在前面的两篇文章里面,对函数模板有了一个清楚的认识,作为类比学习,当然泛型的思想是可以应用到类上的。...2、类模板: 一些类主要用于存储和组织数据元素 类中数据组织的方式和数据元素的具体类型无关 如:数组类,链表类,Stack类,Queue类等等 c++中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型...{ public: T op(T a , T b); }; 4、类模板的应用 只能显示指定具体类型,无法自动推导(我们的函数模板是可以实现自动推导具体类型的) //使用具体类型"...T可以出现在类模板的任意地方 编译器对类模板的处理方式和函数模板相同 -从类模板通过具体类型产生不同的类 -在声明的地方对类模板代码本身进行编译 -在使用的地方对参数替换后代码进行编译 代码实践: #include.../a.out 3 20 -1 2 二、总结: 泛型编程的思想可以应用于类 类模板以相同的方式处理不同的类型的数据 类模板非常适用于编写数据结构相关的代码 类模板在使用时只能显示指定类型 好了,今天的分享就到这里

    52620

    Java泛型的学习和使用

    什么是泛型? 泛型,即“参数化类型”,就跟在方法或构造函数中普通的参数一样,当一个方法被调用时,实参替换形参,方法体被执行。当一个泛型声明被调用,实际类型参数取代形式类型参数。 泛型 2....重载Overloading是一个类中多态性的一种表现,如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。...Overloaded的方法是可以改变返回值的类型但同时参数列表也得不同。...set方法只有相同的名称,并没有相同的参数,所以并不满足“重写”的定义; 在看下,重载的定义,“如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading...;下面,让我来进一步去分析: 子类TestChild继承了父类Test,并传入泛型变量String,如果忽略泛型擦除的存在,父类Test代码应该变成这样: 意淫下的父类 但实际上,Java在编译期已经将泛型变量擦除

    1.7K40

    浅谈 C++ 元编程

    类模板 和 函数模板 分别用于定义具有相似功能的 类 和 函数 (function),是泛型中对 类型 和 算法 的抽象。...转化为常量表达式,类似测试表达式实现重载的选择(但需要添加一个冗余的 函数参数/函数返回值/模板参数); std::void_t 直接 检查依赖 的成员/函数是否存在,不存在则无法重载(可以用于构造谓词...是否为特定的类型 的判断,类似于代码,将 unsigned Val 改为 typename Type;并把传入的模板参数由 值参数 改为 类型参数,根据最优原则匹配重载。...是否满足某些条件 的判断,在代码中,展示了如何将 C 语言的基本类型数据,转换为 std::string 的函数 ToString。...一般思路是:提供两类重载 —— 一类接受 任意参数,内部 递归 调用自己;另一类是前者的 模板特化 或 函数重载,直接返回结果,相当于 递归终止条件。它们的重载条件可以是 表达式 或 类型。

    3.7K61

    泛型

    如今,泛型已经广泛应用于C#的各个领域,其中用得较多的有如下几项: 集合(在集合中泛型一如既往地重要); 委托(尤其是在LINQ中的应用); 异步代码(Task表示该方法将返回一个类型为T的值);...2.1.4节将介绍Tuple类,该类用于创建各种泛型Tuple类的实例。 类似于泛型类型,泛型方法也可以定义同名但泛型度不同的方法。...这种方式类似于以不同参数来定义不同的重载方法,只不过是根据类型形参的数量来定义重载。...对于类型成员来说,就没那么界限分明了。有些类型成员因为使用了其他泛型类型,看似泛型成员,但实际不是。只需记住一条原则:判断一个声明是否是泛型声明的唯一标准,是看它是否引入了新的类型形参。...这个问题还可以进一步复杂化:将泛型类型嵌套。像下面这个类定义这样,类型实参的不同组合将得到不同的类型。

    2.1K10

    看完这篇Java基础,你也是天花板

    重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分 重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类...—>父类代码块——>父类构造器——>子类代码块——>子类构造器 泛型 泛”就是宽泛,泛指的意思,所谓泛型就是不指定具体类型,而是作为参数传递。...除了定义泛型类,还可以定义泛型接口和泛型方法,使用泛型方法时不必指明参数类型,编译器会根据传递的参数自动查找出具体的类型。...限制泛型的可用类型: 通过 extends 关键字可以限制泛型的类型 泛型代码与JVM: 虚拟机中没有泛型,只有普通类和方法。...在编译阶段,所有泛型类的类型参数都会被Object或者它们的限定边界来替换。(类型擦除) 在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的多态灾难。

    55011

    TypeScript进阶 之 重难点梳理

    说白了,「泛型就是不预先确定的数据类型,具体的类型在使用的时候再确定的一种类型约束规范」。 泛型可以应用于 function、interface、type 或者 class 中。...但是注意,「泛型不能应用于类的静态成员」 几个简单的例子,先感受下泛型 function log(value: T): T { console.log(value); return...如果不指定类型,就在定义的之后指定一个默认的类型 myLog(1) 「我们也可以把泛型变量理解为函数的参数,只不过是另一个维度的参数,是代表类型而不是代表值的参数。」...class Log { // 泛型不能应用于类的静态成员 run(value: T) { console.log(value) return value...增强程序的扩展性 不必写多条函数重载,冗长的联合类型声明,增强代码的可读性 灵活控制类型之间的约束 泛型,在 ts 内部也都是非常常用的,尤其是对于容器类非常常用。

    4.3K20

    Titan Framework MongoDB深入理解2

    add()方法是该类内的插入数据方法,基础的使用方式参数为表名以及一个泛型类型,框架会将表名作为mongo中存储的表名字,而泛型类型会通过转换器转换为一个mongo节点类型进行存储。...add()拥有一个重载方法,参数为表名和一个list类型,规定需要指明list中的泛型类型,框架会将该list中所有的对象根据该类型转化为mongo节点进行存储。...update()方法是该类内的修改方法,参数为表名,泛型类型(source),泛型类型(target),框架会根据表名查找对应的表数据,转换source对象为mongo节点类型,并匹配表中拥有该节点类型特征的所有数据...totalCount()方法是该类内提供的一个查找存在数量的方法,很多业务逻辑有时候不需要查询完整的数据,而只需要查询是否存在(验证)或查询存在的数量(分页),此时前者可以使用参数为表名,泛型类型(condition...),该方法会将泛型类型转换为mongo节点类型,并查找表中是否存在该数据,返回查找到的条数;而后者可以使用该方法的重载方法,参数为一个MongoDBQueryCondition类型,该类型是框架内的一个条件类型

    74140

    C#泛型详解

    : public class Node where T : class         where V: struct 泛型方法 泛型不仅能作用在类上,也可单独用在类的方法上,他可根据方法参数的类型自动适应各种参数...特定封闭类中任一静态成员变量被调用。 泛型类中的方法重载 方法的重载在.Net Framework中被大量应用,他要求重载具有不同的签名。...,如果T和V都传入int的话,三个add方法将具有同样的签名,但这个类仍然能通过编译,是否会引起调用混淆将在这个类实例化和调用add方法时判断。...由以上示例可知,C#的泛型是在实例的方法被调用时检查重载是否产生混淆,而不是在泛型类本身编译时检查。同时还得出一个重要原则: 当一般方法与泛型方法具有相同的签名时,会覆盖泛型方法。...泛型类的方法重写 方法重写(override)的主要问题是方法签名的识别规则,在这一点上他与方法重载一样,请参考泛型类的方法重载。

    1.5K60

    C#泛型详解

    : public class Node where T : class         where V: struct 泛型方法 泛型不仅能作用在类上,也可单独用在类的方法上,他可根据方法参数的类型自动适应各种参数...特定封闭类中任一静态成员变量被调用。 泛型类中的方法重载 方法的重载在.Net Framework中被大量应用,他要求重载具有不同的签名。...,如果T和V都传入int的话,三个add方法将具有同样的签名,但这个类仍然能通过编译,是否会引起调用混淆将在这个类实例化和调用add方法时判断。...由以上示例可知,C#的泛型是在实例的方法被调用时检查重载是否产生混淆,而不是在泛型类本身编译时检查。同时还得出一个重要原则: 当一般方法与泛型方法具有相同的签名时,会覆盖泛型方法。...泛型类的方法重写 方法重写(override)的主要问题是方法签名的识别规则,在这一点上他与方法重载一样,请参考泛型类的方法重载。

    1.2K21

    彻底讲清 Java 的泛型(上)

    普通的类和方法只能使用特定的类型:基本数据类型或类类型。 如果编写的代码需要应用于多种类型,这种严苛的限制对代码的束缚就会很大。 多态是一种面向对象思想的泛化机制。...可以将方法的参数类型设为基类,这样的方法就可以接受任何派生类作为参数,包括暂时还不存在的类。 这样的方法更通用,应用范围更广。在类内部也是如此,在任何使用特定类型的地方,基类意味着更大的灵活性。...随后你会发现 Java 中泛型的实现并没有那么“泛”,你可能会质疑“泛型”这个词是否合适用来描述这一功能。 实例化一个类型参数时,编译器会负责转型并确保类型的正确性。...一般来说,你可以认为泛型和其他类型差不多,只不过它们碰巧有类型参数。 在使用泛型时,只需要指定它们的名称和类型参数列表。 3 一个元组类库 有时一个方法需要能返回多个对象。...当然,可以在每次需要的时候,专门创建一个类来完成这样的工作。 有了泛型,我们就可以一劳永逸。同时,还获得了编译时的类型安全。 这称为 元组 将一组对象直接打包存储于单一对象中。

    77330
    领券