首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

2.9K10

Kotlin 泛型:类型参数约束

上一篇文章讲了 Kotlin 泛型:基本使用,接下来我们再进一步了解泛型使用相关的进阶知识。本篇是 Kotlin 泛型类型参数约束的讲解,更多内容可点击链接查看。...Kotlin 泛型:基本使用Kotlin 泛型:类型参数约束系列持续更新中,欢迎关注订阅。...将一个类型指定为「类型形参」的「上界约束」,那么在使用具体类型作为「类型实参」时,这个具体的类型必须是这个上界约束的类型或者它的子类型。...「上界约束」是这样定义的:在类型参数名称之后,添加冒号和作为类型形参的类型。没有指定类型上界时,是这么定义的:,将Number指定为上界类型后,是这样的:。...max函数但因为Any类没有实现Comparable,尝试作为参数传入max函数,编译器将识别出来,中止代码的编译。

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

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

    九、泛型 in 逆变 十、泛型 invariant 不变 十一、泛型逆变协变代码示例 十二、使用 reified 关键字检查泛型参数类型 一、泛型类 ---- 定义一个 泛型类 , 将 泛型参数 T...主构造函数中可以接收 T 类型的实例对象作为参数 , T 类型可以 作为函数的返回值 ; 通常情况下 , 泛型参数 都使用 T 表示 , 使用其它字母 或者 字符串 都可以表示 泛型参数 , 但是 约定俗成...子类泛型对象 ; 在 泛型类 中 , 如果只将 泛型类型 作为 函数的参数 类型 , 则在 声明 泛型参数 类型 时 , 在 泛型参数 前 使用 in 关键字 , 同时 该 泛型类 又称为 消费类...(t: T) } 十、泛型 invariant 不变 ---- 在 泛型类 中 , 如果 既将 泛型类型 作为 函数的参数 类型 , 又将 泛型类型 作为 函数的返回值 类型 , 则在 声明 泛型参数...在 Java 中 , 运行时 不知道 泛型参数 的 具体类型 ; 在 Kotlin 中可以 通过 reified 关键字检查 泛型参数类型 ; Java 中如果想要知道 泛型参数 具体类型 , 通过常规的方法无法实现

    4.1K10

    【Kotlin】泛型 ③ ( 泛型 out 协变 | 泛型 in 逆变 | 泛型 invariant 不变 | 泛型逆变协变代码示例 | 使用 reified 关键字检查泛型参数类型 )

    作为 函数的返回值 类型 , 则在 声明 泛型参数 类型 时 , 在 泛型参数 前 使用 out 关键字 , 同时 该 泛型类 又称为 生产类 ( 生产接口 ) , 用于生产 泛型类 指定的泛型对象...- 使用 in 关键字 , 可以使 父类泛型对象 赋值给 子类泛型对象 ; 在 泛型类 中 , 如果只将 泛型类型 作为 函数的参数 类型 , 则在 声明 泛型参数 类型 时 , 在 泛型参数 前...Consumer { fun consume(t: T) } 三、泛型 invariant 不变 ---- 在 泛型类 中 , 如果 既将 泛型类型 作为 函数的参数 类型 , 又将...泛型类型 作为 函数的返回值 类型 , 则在 声明 泛型参数 类型 时 , 既不使用 in 关键字 , 又不使用 out 关键字 ; 代码示例 : 在下面的接口中 , 泛型类型 即用于作为 返回值 ,...在 Java 中 , 运行时 不知道 泛型参数 的 具体类型 ; 在 Kotlin 中可以 通过 reified 关键字检查 泛型参数类型 ; Java 中如果想要知道 泛型参数 具体类型 , 通过常规的方法无法实现

    1.7K10

    C#编程中掌握委托(将方法作为参数传递)

    在 C# 中,通常使用委托或 lambda 表达式将方法作为参数传递。 将方法作为参数传递 |使用 C# 编程掌握委托 委托是引用具有特定签名的方法的类型,允许您将方法作为参数传递给其他方法。...在本文中,我们将深入探讨将方法作为参数传递的概念,探索委托的工作原理,并演示在 C# 中掌握这一基本技能的实际示例。 下面介绍如何使用 C# 掌握委托。 1....将方法作为参数传递 |使用 C# 编程掌握委托 将方法分配给委托人: 将方法作为参数传递 |使用 C# 编程掌握委托 3. 将委托作为参数传递 您可以将委托作为参数传递给其他方法,以动态定义行为。...Func 和 Action 委托 C# 提供泛型委托,而不是声明自定义委托类型: Func:当方法返回值时使用。 操作:当方法返回 时使用。...在 C# 中使用委托将方法作为参数传递是创建灵活且可重用代码的强大功能。您可以使用委托、lambda 表达式和内置类型(如 和 )动态分配、传递和调用方法。

    11610

    【Kotlin】泛型 ② ( 可变参数 vararg 关键字与泛型结合使用 | 使用 [] 运算符获取指定可变参数对象 )

    文章目录 一、可变参数 vararg 关键字与泛型结合使用 二、使用 [] 运算符获取指定可变参数对象 一、可变参数 vararg 关键字与泛型结合使用 ---- 如果 泛型类型 T 的参数 是 vararg...可变参数 , 则在接收 可变参数 时 , 需要使用 Array 类型 的变量进行接收 ; 参数为 vararg 可变参数 , 那么可以传入多个 指定类型的 实例对象 ; 在下面的代码中..., 声明了 泛型参数 T , T 类型不必须是 Weapon 类的子类类型 ; 在 Soldier 的主构造函数中 , 传入了 泛型 T 类型的 可变参数 对象 ; 如果要使用 成员属性 接收该 泛型...T 类型的 可变参数 对象 , 则必须 使用 Array 类型对象进行接收 ; 代码示例 : class Soldier(vararg _items: T) {...二、使用 [] 运算符获取指定可变参数对象 ---- 如果想要 使用 [] 运算符获取指定可变参数对象 , 就需要 重写 该类 的 get 函数 进行 运算符重载 ; 如果想要通过 Soldier 实例对象

    76820

    T::class 和 this::class 的区别

    引子 前几天推送了一篇文章:你绝对想不到 Kotlin 泛型给反射留下了怎样的坑!,受到一位朋友的评论的启发,这篇文章就承接前文,探讨一下 T::class 和 this::class 区别。...泛型参数的例子 其实问题是很清楚的,this::class 表示的是对象的类型,而 T::class 则取决于 T 被如何推断。具体用哪个,取决于你的需求。...我们知道 Kotlin 的泛型也是伪泛型,T 在这里不能直接用于获取其具体的类型,如果我们想要初始化 t,该怎么做呢?....arguments.first() // T 的泛型实参 .type!!....也正是因为这一点,我们想要获取泛型参数 T 的实参,还需要先拿到 super type 也就是 A 的 KType 实例了。 其次,获取泛型实参,并拿到实参类型的 KClass 实例。

    1.3K30

    【C++】泛型编程 ⑦ ( 类模板常用用法 | 类模板声明 | 类模板调用 | 类模板作为函数参数 )

    ; MyClass 此时 , 注明 泛型类型后 , 就会生成 具体的类 ; 然后 , 使用 具体的类 , 定义 具体的 变量 ; MyClass myInt(10); 3、类模板做函数参数...类模板 作为函数参数 , 形参 必须是具体类型 , 也就是 类模板 的泛型类型必须声注明 ; 下面的 fun 函数中 , 接收模板类作为参数 , 模板类的 泛型类型 需要被注明 ; // 类模板对象作为函数参数...// 形参必须是具体类型 // 类模板的泛型类型必须声注明 void fun(MyClass &a) { a.printValue(); } 如果不指定 泛型类型 , 会报错 error...:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(39,15): error C2664: “void fun(MyClass &)”: 无法将参数...T , 并创建一个具有该类型的成员变量的对象 ; MyClass是一个模板类 , 该模板类 接受一个 泛型类型参数T , 泛型类型参数 T 在类中的许多地方都会用到 , 在类体中定义了一个 T 类型的成员变量

    8000

    【C++】泛型编程 ⑦ ( 模板类常用用法 | 模板类声明 | 模板类调用 | 模板类作为函数参数 )

    ; MyClass 此时 , 注明 泛型类型后 , 就会生成 具体的类 ; 然后 , 使用 具体的类 , 定义 具体的 变量 ; MyClass myInt(10); 3、类模板做函数参数...类模板 作为函数参数 , 形参 必须是具体类型 , 也就是 类模板 的泛型类型必须声注明 ; 下面的 fun 函数中 , 接收模板类作为参数 , 模板类的 泛型类型 需要被注明 ; // 类模板对象作为函数参数...// 形参必须是具体类型 // 类模板的泛型类型必须声注明 void fun(MyClass &a) { a.printValue(); } 如果不指定 泛型类型 , 会报错 error...:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(39,15): error C2664: “void fun(MyClass &)”: 无法将参数...T , 并创建一个具有该类型的成员变量的对象 ; MyClass是一个模板类 , 该模板类 接受一个 泛型类型参数T , 泛型类型参数 T 在类中的许多地方都会用到 , 在类体中定义了一个 T 类型的成员变量

    51440

    一文了解 JavaKotlin 中的泛型

    ,比如 List 中的 String 就是类型参数,和普通参数不同,类型参数传递的是一个类型而不是对象为了描述方便,以下把所有「类型参数为子类的泛型」简称为「子类泛型」,「类型参数为父类的泛型...」简称为「父类泛型」对于从 Java 转到 Kotlin 的开发者们来说,要了解泛型,最好先搞懂 Java 中的泛型,再来看 Kotlin 的泛型时会变得易如反掌。...有时候我们希望把子类泛型对象作为实参传递给一个声明为父类泛型的形参,例如:public int getAnimalsCount(List animals) { return animals.size...extends Animal 表示此方法可以接受 Animal 或者 Animal 子类的集合,这就使得泛型类型协变了逆变同理,有时候我们希望把父类泛型对象作为实参传递给子类泛型的形参,例如// 用于监听小动物是否饿了的监听器...T> {}// 在声明的时候没有指定型变,此时该泛型类型的不型变的interface SourceB {}// 使用处型变: 在使用 SourceB 作为参数的时候,我们指定了类型参数为 out

    93620

    一文了解 JavaKotlin 中的泛型

    ,比如 List 中的 String 就是类型参数,和普通参数不同,类型参数传递的是一个类型而不是对象为了描述方便,以下把所有「类型参数为子类的泛型」简称为「子类泛型」,「类型参数为父类的泛型...」简称为「父类泛型」对于从 Java 转到 Kotlin 的开发者们来说,要了解泛型,最好先搞懂 Java 中的泛型,再来看 Kotlin 的泛型时会变得易如反掌。...有时候我们希望把子类泛型对象作为实参传递给一个声明为父类泛型的形参,例如:public int getAnimalsCount(List animals) { return animals.size...extends Animal 表示此方法可以接受 Animal 或者 Animal 子类的集合,这就使得泛型类型协变了逆变同理,有时候我们希望把父类泛型对象作为实参传递给子类泛型的形参,例如// 用于监听小动物是否饿了的监听器...T> {}// 在声明的时候没有指定型变,此时该泛型类型的不型变的interface SourceB {}// 使用处型变: 在使用 SourceB 作为参数的时候,我们指定了类型参数为 out

    1.1K52

    Kotlin 泛型:基本使用

    Kotlin 泛型:基本使用Kotlin 泛型:类型参数约束系列持续更新中,欢迎关注订阅。为什么需要泛型假如我们想实现自定义的列表类型,用于存放数值、字符串或其他具体的类型。...什么是泛型泛型提供了一种方法,允许我们定义带「类型参数」的泛型类/泛型函数,在创建泛型类的实例、调用泛型函数时,「类型参数」将替换成具体的「类型实参」。...// 编译出错,类型不匹配泛型机制允许我们在编码的时候,使用占位符作为类型(即「类型参数」代替实际使用时的类型(即「类型实参」)。如何区别上述两个概念?...// Always true了解到这里,就掌握了基本的泛型使用方式:用「类型参数」作为占位符,定义泛型类、泛型函数使用泛型类、泛型函数时,需要传递具体类型作为「类型实参」。...下一篇文章,将介绍 Kotlin 泛型的进阶知识:类型参数约束

    1.8K30

    Kotlin入门潜修之类和对象篇—泛型及其原理

    而假如我们在创建类型的时候也为其指定参数,这个参数又是个类型,那么我们就称之为泛型。 那么泛型的作用和意义是什么?使用泛型能够像传递参数一样传递类型,同时保证运行时的类型安全。...> list) { //在该方法中测试添加对象,实际上测试的是无界通配符作为类泛型参数的场景,因为list的类型是泛型List即List list) { //在该方法中测试添加对象,list.add实际上测试的是通配符作为类泛型参数的场景,因为list的类型是泛型List类即List list) { //在该方法中测试添加对象,list.add实际上测试的是通配符作为类泛型参数的场景,因为list的类型是泛型List类即List<?...in修饰符允许我们写 } 这种情况叫做逆变,即我们当类型参数具有继承关系的时候,我们可以认为整个泛型也有继承关系,而使用in修饰后,可以允许父类型变量赋值于子类型变量,如上面代码中,将Comparable

    93830

    Kotlin泛型的型变之路

    ❝正是由于泛型擦除的问题,你甚至可以通过反射绕开泛型的限制,传递一个非当前泛型限制的对象。...但是这种处理在我们处理泛型业务时,会有很多限制,所以,泛型提供了「型变」来拓展泛型的使用。 协变 协变指的是,当参数具有父子关系时,子类可以作为参数传递,而泛型的上界就是其父类。...所以,经过协变之后的泛型,就失去了写入的能力,它只能用于向外提供数据,也就是「数据生产者Producer」。 逆变 逆变指的是,父类可以作为参数传递,但子类必须是其下界。逆变通过下界通配符泛型参数协变后则表示——「这个参数在当前类中,只能作为函数的返回值,或者是只读属性」。...} 而逆变,表示这个参数「只能作为函数的参数,或者修饰可变属性」。

    1.2K21

    Kotlin的互操作——Kotlin与Java互相调用

    当把平台值传递给期待非空值等的Kotlin函数时,也会触发一个断言。总的来说,编译器尽力阻止空值通过程序向远传播(由于泛型的原因,有时这不可能完全消除)。...与Java一样,Kotlin在运行时不保留泛型,也就是对象不携带传递到它们的构造器中的类型参数的实际类型,即ArrayList()和ArrayList()是不能区分的...这使得执行is检查不可能照顾到泛型,Kotlin只允许is检查星投影的泛型类型。...⑦ 型变的泛型 当Kotlin使用了声明处型变时,可以通过两种方式从Java代码中看到它们的用法。...因此,将示例中的对应函数实际上翻译如下: // 作为返回类型——没有通配符 Box boxDerived(Derived value) { … } // 作为参数——有通配符 Base

    3.8K10

    Kotlin Vocabulary | Reified: 类型擦除后再生计划

    解决这一问题的一个方法,是将泛型实际代表的类型信息作为一个参数传递给函数。...若是要在参数中使用 reified,那首先需要将函数标记为 inline,然后在泛型参数之前添加 reified 关键字即可。...从反编译后的代码中可以发现,当调用 reified 修饰的内联函数时,编译器会复制该函数体,并将泛型类型替换为实际使用的类型。这样,您就可以不用将类传递给函数也能够获取到相应类型信息了。...Java 不支持内联,也就意味着在 Java 中的泛型参数不能逃脱被编译器擦除类型的命运。...使用内联函数,编译器可以在复制函数体时,同样将泛型返回类型替换为实际所表示的类型。

    1.3K10
    领券