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

Kotlin 泛型详解

所以我想说的是,泛型这东西,只要你对 Java 泛型有一定的认识,Kotlin 的泛型基本可以直接用。那我们这篇文章要干嘛呢?只是做一个简单的介绍啦,都很好理解的。 1....fun getResult(): R{        ...    } } Java/Kotlin 的泛型实现采用了类型擦除的方式,这与 C# 的实现不同,后者是真·泛型,前者是伪·泛型。...下面是输出的结果: System.String 那伪·泛型呢?如果同样的代码放到 Java 或者 Kotlin 当中,结果会怎样呢?...* 不允许作为函数和变量的类型的泛型参数! fun hello(args: Array){     ... } ... hello(args) // ERROR!!...* 不允许作为函数和变量的类型的泛型参数! interface Foo class Bar : Foo // ERROR! * 不能直接作为父类的泛型参数传入!

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

    转向Kotlin——泛型

    无论是Java还是Kotlin,泛型都是一个非常重要的概念,简单的泛型应用很容易理解,不过也有理解起来麻烦的时候。一起来认识一下。...泛型基础 在了解Kotlin的泛型之前,先来看看Java中的泛型: 举个栗子:在JDK中,有一类列表对象,这些对象对应的类都实现了List接口。...,不过在Kotlin泛型中,没有通配符。...Kotlin中 Kotlin泛型并没有提供通配符,取而代之的是out和in关键字。用out声明的泛型占位符只能在获取泛型类型值得地方,如函数的返回值。...小结 Kotlin泛型是在Java泛型的基础上进行了改进,变得更好用,更安全,尽管上述的泛型技术不一定都用得上,但对于全面了解Kotlin泛型会起到很大作用。

    93520

    kotlin--泛型

    kotlin作为一种高级语言,也提供了泛型,它的泛型比Java更为灵活 一、泛型类 1.定义泛型类 定义泛型类和Java差不多 class Magic(_item: T) { var subOject...1.如果想要对传递的泛型作约束,可以指定泛型的父类 //指定父类 class Magic(_item: T) { var subOject: T = _item...,没有继承关系 6.reified kotlin也不允许对泛型作类型检查,当我们想要知道泛型参数具体是哪个类型时,可以使用reified关键字修饰 reified必须和inline配合使用,原因是编译的时候...Human() fun main() { val magic = Magic() println(magic.getBoy { Boy("danny", 15) }) } 随机到不是Boy型变量的结果...: com.aruba.mykotlinapplication.Man@3f99bd52 com.aruba.mykotlinapplication.Boy@4f023edb 随机到Boy型变量的结果

    32710

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

    文章目录 一、泛型类 二、泛型参数 三、泛型函数 四、多泛型参数 五、泛型类型约束 一、泛型类 ---- 定义一个 泛型类 , 将 泛型参数 T 放在 尖括号 中 , 该泛型参数放在 类名后...下面的代码中 , 声明了 Student 泛型类 , 该泛型类 接收 T 类型的泛型参数 , 在主构造函数中接收 T 类型的参数 , 在该泛型类中声明了 T 类型的成员属性 ; class Student...---- 泛型函数 中 如果涉及到 匿名函数 参数 , 匿名函数 的 参数返回值 都是泛型 的话 , 在该泛型函数 中可能需要使用多个泛型 , 使用不同的字母表示不同的泛型 ; 如果函数中 引入了新的泛型类型...R 的类型是 Boolean 类型 ; 3.14 true 五、泛型类型约束 ---- 在 泛型类 , 泛型函数 中 , 使用泛型前 , 需要声明 泛型参数 : 泛型类 泛型参数 声明 : 如果类中...; 在创建 Soldier 实例对象时 , 传入 子类 AK47 类的实例对象 , 调用其重写父类的 fire 函数 ; 代码示例 : class Soldier(_item:

    2.9K10

    Kotlin | 9. 泛型

    本章内容包括: 声明泛型函数和类 类型擦除和实化类型参数 声明点变型和使用点变型 9.1 泛型类型参数 // 如果要创建一个空的列表,必须显示的指定,有值的话可以被推导出来...和Java一样,Kotlin的泛型在运行时也被擦除了。...会提示报错 // println(Validators[String::class].validate(42)) 总结 Kotlin 的泛型和 Java 相当接近:它们使用同样的方式声明泛型函数和泛型类...变型是一种说明两种拥有相同基础类型和不同类型参数的泛型类型之间子类型化关系的方式,它说明了如果其中一个泛型类型的类型参数是另一个的类型参数的子类型 这个泛型类型就是另外一个泛型类型的子类型或者超类型。...在Kotlin 中既可以为整个泛型类指定变型(声明点变型),也可以为泛型类型特定的使用指定变型(使用点变型)。 当确切的类型实参是未知的或者不重要的时候,可以使用星号投影语法。

    1.8K10

    Kotlin泛型的型变之路

    kotlin修炼指南7之泛型 泛型,是为了让「类」、「接口」、「方法」具有更加通用的使用范围而诞生的,举个例子,假如我们不使用泛型,那么一个List中可以装得下任何对象,这么做的问题就在于,在使用时,需要对类型进行检查...通用泛型类型:T,S,U,V 集合元素泛型类型:E 映射键-值泛型类型:K,V 数值泛型类型:N 要理解Kotlin的泛型,我们最好首先从Java的泛型来学习,毕竟Kotlin的语法糖太多了,Java会更加白话文一点...Kotlin型变 泛型让我们有了可以支持多种类型的能力,型变让我们有了修改泛型的能力,总结来说: 泛型通配符泛型之后,我们再来看下Kotlin的泛型,这时候你再看,就没那么复杂了,核心就两条。 使用关键字 out 来支持协变,等同于 Java 中的上界通配符 ?...Kotlin官网上有个著名的——Consumer in, Producer out,说的就是这个意思。 Kotlin泛型的优化 我们通过这个例子来看下Kotlin对Java泛型的改进。

    1.2K21

    Kotlin 泛型:基本使用

    在 Kotlin 中声明和使用泛型类、泛型函数的基本概念和 Java 相似,有 Java 泛型概念的情况下,不用详细解释或者做进一步了解,也能够很容易地上手使用泛型。...但使用泛型仅仅是第一步,要想将泛型应用好,仍然需要做进一步深入的学习。本篇是 Kotlin 泛型的基础介绍,进阶内容可点击链接查看。...Kotlin 泛型:基本使用Kotlin 泛型:类型参数约束系列持续更新中,欢迎关注订阅。为什么需要泛型假如我们想实现自定义的列表类型,用于存放数值、字符串或其他具体的类型。...「类型参数」是占位符,就像变量一样,可以任意取名,一般使用单个大写字母(T、U、V)、全大写单词(DATA、TOKEN)、或首字母大写的单词(Data、Token);「类型实参」是具体的类型,只能传入已存在的具体类型...下一篇文章,将介绍 Kotlin 泛型的进阶知识:类型参数约束

    1.8K30

    kotlin入门之泛型

    【码上开学】Kotlin 的泛型 在学习kotlin 泛型之前我们先来回顾一下关于Java的泛型基础吧。 说道泛型,我们可能最常用的就是在三大集合中去使用。...说完了Java的泛型之后,我们在回头看一下kotlin中的泛型。 kotlin 中的out和in kotlin和java泛型一样,kotlin中的泛型本身也是不可变的。...号也能作为泛型通配符使用,相当于 ? extends Object。 它在 Kotlin 中有等效的写法:* 号,相当于out Any。...var list: List 和 Java 不同的地方是,如果你的类型定义里已经有了out或者 in, 那这个限制在变量声明时也依然在,不会被*号去掉。...伪泛型:编译时擦除类型,运行时无实际类型生成 例如:java、kotlin 真泛型:编译时生成真实类型,运行时也存在该类 例如:C#、C++ 我们知道JVM上的泛型,一般是通过类型擦除来实现的

    1.2K20

    Kotlin基础之泛型

    上面的代码可以简化为: val box = Box(1) 型变 Java类型系统中最复杂的其中一个部分就是通配符类型(Java泛型FAQ)。...首先,Java中泛型为不可变类型,意味List不是List的子类型。为什么这样?如果List为可变量,List不会比Java的数组更好,并且下面的代码能够成功编译,但在运行时会引起异常。...除了out,kotlin提供了一个补充的变型注解:in。让类型参数变为逆变量:只能消费,从不生产。Comparable就是协变量一个很好的例子。...此时安全地定义投影的泛型,每个泛型的具体实例都是泛型的子类型。 为此,Kotlin提供称为星号投影的语法。 对于Foo,T为带有上界TUpper的协变量,Foo等价于Foo。...val l = SingletonList(1) 泛型约束 所有可以被指定类型参数替代的类型,都可以使用泛型约束进行限制。

    98870

    Kotlin 泛型:类型参数约束

    上一篇文章讲了 Kotlin 泛型:基本使用,接下来我们再进一步了解泛型使用相关的进阶知识。本篇是 Kotlin 泛型类型参数约束的讲解,更多内容可点击链接查看。...Kotlin 泛型:基本使用Kotlin 泛型:类型参数约束系列持续更新中,欢迎关注订阅。...为什么需要类型参数约束在上一篇文章里,我们使用泛型定义了一个泛型列表List,使用这个列表,我们可以在使用的时候,实例化出各种具体类型的列表,比如字符串列表List、整型列表List...利用范型约束实现非空范型Kotlin 有一个为人称道的特性:不可空。但当我们使用范型时,这个特性在不幸的失效了。...,这使得泛型类在具体实现的时候,需要考虑参数为空的情况,也让编写代码的具体实现变得复杂。

    2.3K31

    Kotlin 进阶 泛型知识详解

    前言 详细介绍Kotlin中关于泛型的知识。方便我们理解泛型在Kotlin中的使用。 如果对于泛型知识不太了解,也可以通过本篇文章了解泛型到底是什么,并且对我们开发到底有什么作用。...介绍 什么是泛型?我们如果定义类和接口等,针对传入的数据不确定类型的。统一叫做泛型,通过泛型来实现数据类型的动态化。 使用泛型可以最大限度的重用代码,并且保护数据类型的安全以及提高性能。...我们可以在函数声明,属性声明,类声明和接口声明中使用泛型。下面也从这四个维度进行介绍泛型在Kotlin中的使用。 1.声明泛型函数 例如,我们声明一个比较函数。...在Kotlin中的泛型定义和java中其实很类似。都是使用来进行标注。 小知识:泛型并不是必须用T字母来代替。...1.2 泛型约束 我们在上面定义了各种T,Z,I,N,等泛型。但是泛型定义后,到底怎么使用呢?不能乱写吧?这个就是泛型约束了。

    26730

    Android面试题之Java 泛型和Kotlin泛型

    反射的时候提供了一套API可以拿到,比如getGenericType() 泛型带来的问题 泛型类型变量不能使用基本类型 比如没有ArrayList,只有ArrayList,当泛型擦除后...,ArrayList的原始类中的类型变量T替换成了Object,但Object不能存放基本数据类型 不能使用instanceof运算符 因为泛型擦除后,ArrayList只剩下原始类型,...,在Java运行时根本就不存在泛型信息 2、Java编译器具体是如何擦除泛型的 检查泛型类型,获取目标类型 擦除类型变量,并替换为限定类型。...如果泛型类型的类型变量没有限定(),则Object为原始类型;如果有限定(),则用XClass作为限定类型;如果有多个限定(T extends XClass1...在必要时插入类型转换以保持类型安全 生成桥方法以在扩展时保持多态性 Kotlin泛型 Kotlin的泛型可以看文章:Android面试题之Kotlin泛型和reified关键字 END 点亮【赞和在看】

    7410

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

    六、可变参数 vararg 关键字与泛型结合使用 ---- 如果 泛型类型 T 的参数 是 vararg 可变参数 , 则在接收 可变参数 时 , 需要使用 Array 类型 的变量进行接收..., 泛型参数 是 子类 的 泛型类对象 , 不可以赋值 给 泛型参数 是父类 的变量 ; Java 中的泛型对象赋值 , 不存在继承关系 , 是什么类型就是什么类型 , 类型要严格相同 ; import...语言中 , 泛型参数是 子类 的 泛型类对象 , 可以赋值给 泛型参数 是父类 的变量 , 前提是泛型参数必须使用 out 关键字修饰 ; 使用 in 关键字 , 可以使 父类泛型对象 赋值给...// FastFoodFactory 是 Producer 子类 // Producer 的泛型参数 FastFood 是 Food 的子类 // 在 Kotlin...在 Java 中 , 运行时 不知道 泛型参数 的 具体类型 ; 在 Kotlin 中可以 通过 reified 关键字检查 泛型参数类型 ; Java 中如果想要知道 泛型参数 具体类型 , 通过常规的方法无法实现

    4.1K10

    kotlin修炼指南7之泛型

    Kotlin在Java的基础上,同样对泛型语法进行了拓展,所以很多Kotlin开发者,看着源码中的一堆in、out和*,感觉非常不知所措。...其实,只要了解了Java泛型,那么Kotlin泛型就迎刃而解了。 首先,我们来想想,我们为什么需要泛型。...泛型的型变 正是由于存在泛型的不变性,所以我们在支持某些场景的泛型参数时,就需要通过「泛型的型变」来拓展「泛型的不变性」。...Kotlin,或者说Java的泛型,实际上是一种伪泛型,即泛型只在申明时检查泛型是否有效,在编译时,泛型类型会被擦除,这是因为Java的历史原因所导致的,由于它为了兼容没有泛型的老Java版本,从而做出的妥协...在Kotlin中,集合类大量使用了协变,如下所示。

    65030

    JAVA_静态泛型方法及静态泛型成员变量

    参考链接: Java中的静态方法与实例方法 #1.泛型类中的静态方法不能使用类的泛型,而应该将该方法定义为泛型方法  1.错误示范:  class demo{     public static...class demo{     public static T show(T temp) {         return temp;     } }  3.原因:     在java中泛型只是一个占位符...就泛型类而言,类实例化时才能传递真正的类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数时,静态方法就已经加载完成。显然,静态方法不能使用/访问泛型类中的泛型。 ...这和静态方法不能调用普通方法/访问普通变量类似,都是因为静态申明与非静态申明的生命周期不同。 ...#2.不能定义静态泛型变量  1.原因:  由于静态变量在java程序一运行时就已经被载入内存,而此时它的类型无法确定,而开辟空间必须知道类型,两者矛盾。

    6.1K20

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

    ---- 泛型类 中 泛型参数 有 子类 和 父类 , Java 语言中 , 泛型参数 是 子类 的 泛型类对象 , 不可以赋值 给 泛型参数 是父类 的变量 ; Java 中的泛型对象赋值 ,...语言中 , 泛型参数是 子类 的 泛型类对象 , 可以赋值给 泛型参数 是父类 的变量 , 前提是泛型参数必须使用 out 关键字修饰 ; 使用 in 关键字 , 可以使 父类泛型对象 赋值给...FastFood 是 Food 的子类 , 在 Kotlin 中 , 可以将 Producer 类型赋值给 Producer 类型 , 在 Java 中这种用法不行 ;...// FastFoodFactory 是 Producer 子类 // Producer 的泛型参数 FastFood 是 Food 的子类 // 在 Kotlin...在 Java 中 , 运行时 不知道 泛型参数 的 具体类型 ; 在 Kotlin 中可以 通过 reified 关键字检查 泛型参数类型 ; Java 中如果想要知道 泛型参数 具体类型 , 通过常规的方法无法实现

    1.7K10
    领券