最近在学kotlin,这是本人看菜鸟教程后所做的笔记,很多会内容和菜鸟教程重复,仅供参考 基础语法 包声明 //类在包的位置 package com.demo.main import java.util...,一个没有实现方法时,默认是没有实现方法的, super.foo()切换实现方法,两个都有时也可以通过这个方式切换实现方法 泛型 泛型,即 "参数化类型",将类型参数化,可以用在类...与 Java 一样,Kotlin 也提供泛型,为类型安全提供保证,消除类型强转的烦恼。...我们可以使用泛型约束来设定一个给定参数允许使用的类型。...Kotlin 中使用 : 对泛型的的类型上限进行约束。
String时,就像我们上面做的那样,我们通过传递对该类型本身的引用来传递我们希望字符串被解码的编码——在本例中是UTF8。...如果我们再深入一点,就会发现 Swift 标准库将我们上面提到的UTF8类型定义为另一个类似命名空间的枚举中的一个无大小写枚举,称为Unicode。...enum HTML {} enum PDF {} } 请注意,这里不涉及任何协议——任何类型都可以被用作格式,因为就像String和它的各种编码一样,我们将只使用文档的Format类型作为编译时的标记...虽然使用幻象类型通常会使API更加冗长,而且确实伴随着泛型的复杂性——当处理不同的格式和变体时,它可以让我们减少对运行时检查的依赖,而让编译器来执行这些检查。...就像一般的泛型一样,我认为在部署幻象类型之前,首先要仔细评估当前的情况,这很重要。
本章内容包括: 声明泛型函数和类 类型擦除和实化类型参数 声明点变型和使用点变型 9.1 泛型类型参数 // 如果要创建一个空的列表,必须显示的指定,有值的话可以被推导出来...in authors } // 这个 泛型扩展函数 能任何种类元素的列表上调用 // val List.penultimate: T //...>的List是只读的,所以它只有一个返回类型为 T 的元素的方法 get,而没有定义任何类型为T的元素存储到列表中的方法,因为它是协变的。...可以声明一个类在某个类型参数上是协变的,如果该参数只是用在 out 位置。 逆变的情况正好相反:可以声明一个类在某个类型参数上是逆变的,如果该参数只是用在 in 位置。...在Kotlin 中既可以为整个泛型类指定变型(声明点变型),也可以为泛型类型特定的使用指定变型(使用点变型)。 当确切的类型实参是未知的或者不重要的时候,可以使用星号投影语法。
如果泛型类或方法,对泛型成员使用除简单赋值之外的其他操作,或者调用 System.Object 不支持的任何方法,则将对类型参数应用约束,不然易引发异常。...通过使用类型参数 T,我们可以将 Stack 应用于不同类型的数据。 在 Main 方法中,我们分别创建了整数类型、字符串类型和自定义类型(Person)的栈,并对其进行了一些入栈和出栈操作。...引用泛型委托的代码可以指定类型参数以创建封闭式构造类型,就像实例化泛型类或调用泛型方法一样,如以下示例中所示: public delegate void Del(T item); public static...,因此上一行代码可简化为: Del m2 = Notify; 在泛型类中定义的委托,可以和类方法以相同方式来使用泛型类的类型参数。...通过使用泛型,可以将类型作为参数传递给类、方法或委托,从而使代码更加灵活和可配置。这样可以实现更高级别的抽象和模块化。 最后还可以进行安全约束。
集合框架的主要接口 Java集合框架由多个接口组成,这些接口定义了集合的基本操作。 Collection:集合的最基本接口,代表任何不允许重复的一组对象。...泛型在集合中的使用 泛型允许在集合中指定存储对象的类型,从而提供了编译时的类型检查。...通过在集合声明时指定具体的类型参数,可以避免运行时的类型转换错误,同时也使得代码的意图更加清晰。然而,泛型也带来了一些限制,如在某些情况下无法使用泛型数组,这要求开发者在使用时做出适当的权衡。...集合的遍历、搜索和排序 Java集合框架提供了多种方法来遍历集合、搜索元素以及对元素进行排序。 遍历 可以使用增强型for循环、迭代器或Java 8的流(Stream)来遍历集合。...Collections.sort()方法适用于对List进行自然排序,而Java 8的流允许进行更复杂的排序逻辑,包括自定义比较器。 2.
上一篇文章介绍了Kotlin对函数的输入参数所做的增强之处,其实函数这块Kotlin还有好些重大改进,集中体现在几类特殊函数,比如泛型函数、内联函数、扩展函数、尾递归函数...,这正是泛型对象的写法,“Array”可称作泛型变量,至于arrayOf便是本文要说的泛型函数了。...因为类的成员函数依赖于类,只有泛型类(又称模板类)才能拥有成员泛型函数,普通类是不允许定义泛型函数的,否则编译器会直接报错。...不过有个例外情况,如果参数类型都是继承自某种类型,那么允许在定义函数时指定从这个基类泛化开,凡是继承自该基类的子类,都可以作为输入参数进行函数调用,反之则无法调用函数。...对于一个数组对象,若想求得该数组元素的最大值,可以调用数组对象的max方法。
本文将着重介绍Java中的泛型和枚举的概念和使用方法,并通过源代码解析和应用场景案例,对其进行深入探讨。摘要 本文将首先从泛型的定义和基本语法入手,详细介绍泛型类、泛型接口和泛型方法的使用方法。...总结来说,该代码实现了一个简单的泛型类Pair,用于表示键值对。通过使用泛型参数,可以实现对任意类型的键值对进行封装和操作。这种泛型类在实际开发中非常有用,可以方便地存储和处理不同类型的数据。...它接受一个泛型数组,以及两个整数索引作为参数。 在方法中,首先声明了一个临时变量temp,用于存储第一个索引位置的元素。...然后,将第一个索引位置的元素赋值为第二个索引位置的元素,最后将第二个索引位置的元素赋值为temp中存储的元素。 这样,就实现了数组中两个元素的交换。由于是泛型方法,可以适用于任意类型的数组。 ...使用这个方法,可以方便地交换数组中的元素,无论是整型、字符型、字符串还是自定义类型的元素都可以进行交换。
字符串转为其他类型数据Kotlin与Java方式对比 (2)字符串的常用方法 Kotlin方法基本兼容Java相关的方法,比如查找指定位置的字串indexOf方法,截取某指定位置字串的方法substring...size 对于如何获取指定位置的数组元素,Java通过方括号加下标来获取,比如intarray[0] 获取数组中的第一个元素。...在Kotlin中也可以通过下标的方式获取对应的元素,不过Kotlin要比Java多出两个方法 get set,通过get获取元素的值,通过set方法修改元素值,感觉就像在操作ArrayList队列一样...:” 右面表达式的值 小结 通过这次学习应该要掌握的技能 (1) 学会Kotlin对数据类型的变量定义以及变量之间的相互转换 (2) 学会Kotlin对字符串的一些操作 (3) 了解Kotlin一些关键字...,以及标识符的规则 (4) 了解各种类型数组的声明方式以及数组变量常用的方法 (5) 对Kotlin Null 有一定的了解
WINTER } 枚举类内部的枚举变量,除了可以直接拿来赋值之外,还可以通过枚举值的几个属性获得对应的信息,例如ordinal属性用于获取该枚举值的序号,name属性用于获取该枚举值的名称。...当然,为了达到这个代码精简的效果,数据类也得遵循几个规则,或者说是约束条件,毕竟不以规矩不成方圆,正如类定义代码所注释的那样: 1、数据类必须有主构造函数,且至少有一个输入参数,因为它的属性字段要跟输入参数一一对应...那么如果某个泛型函数在类内部定义,即变成了这个类的成员方法,又该如何定义它呢?...//模板类(泛型类)声明对象时,要在模板类的类名后面加上“” 0 -> River("小溪", 100) //如果编译器根据输入参数就能知晓参数类型...(也叫泛型类)。
第12章 元编程与注解、反射 反射(Reflection)是在运行时获取类的函数(方法)、属性、父类、接口、注解元数据、泛型信息等类的内部信息的机制。...元注解说明如下表 元注解名称 功能说明 @Target 指定这个注解可被用于哪些元素 ( 这些元素定义在kotlin.annotation.AnnotationTarget 枚举类中。...而当这个类继承了一个父类,父类中有泛型的信息,那么我们可以通过调用getGenericSuperclass()方法得到父类的泛型信息。...另外,我们所说的 Java 泛型在字节码中会被擦除,并不总是擦除为 Object 类型,而是擦除到上限类型。 在Kotlin也是一样的泛型机制。...Kotlin中的反射怎样获取泛型代码的基本信息。
# Kotlin 的类型系统 ## 类、类型和子类型 - 类(class)是指一种数据类型,类定义定义对象的属性和方法,可以用来创建对象实例,例如 `class Person(val name: String...普通方式定义的泛型是不变的,简单来说就是不管类型A和类型B是什么关系,Generic与Generic(其中Generic代表泛型类)都**没有任何关系**。...in位置,而函数返回类型叫作out位置 #### 协变 :保留子类型化关系 如果在定义的泛型类和泛型方法的泛型参数前面加上out关键词,说明这个泛型类及泛型方法是协变,简单来说类型A是类型B的子类型...Derived 兼容父类型 Base •生产者 Producer #### 逆变: 反转子类型化关系 如果在定义的泛型类和泛型方法的泛型参数前面加上...没有子类型化 | | T只能在out 位置 | T只能在 in 位置 | T可以在任何位置 | ### 泛型中的out与in与 Java 上下界通配符关系 在Kotlin中out代表协变,in代表逆变
泛型约束:枚举、委托和非托管 自C# 2.0引入泛型以来,开发人员就一直在抱怨,无法把一个泛型类型指定为枚举。这个问题终于解决了,你现在可以使用enum关键字作为泛型约束了。...同样,你现在可以使用delegate关键字作为泛型约束了。 这些关键字可能并不是和你预期的那样发挥作用。...在C# 7.3中,你可以在创建数组时对其初始化,就像你对普通数组所做的那样。该提案没有提供细节,但微软正考虑预初始化一个主数组,当函数被调用时可以快速复制。...泛型约束:枚举、委托和非托管 自C# 2.0引入泛型以来,开发人员就一直在抱怨,无法把一个泛型类型指定为枚举。这个问题终于解决了,你现在可以使用enum关键字作为泛型约束了。...在C# 7.3中,你可以在创建数组时对其初始化,就像你对普通数组所做的那样。该提案没有提供细节,但微软正考虑预初始化一个主数组,当函数被调用时可以快速复制。
java中的泛型 前面一直有提到,kotlin是运行于jvm上的语言,其对标的语言就是java,因此我们先来讲一下java的泛型,了解了java泛型的优缺点之后,我们就很容易明白kotlin中泛型的设计初衷了...声明方法的时候为其指定了类型参数T。 } } 上例简单展示了泛型的定义,上面的T可以传入任何类型进行表示,这就相当于一个入参,只不过这个入参是个类型而已。...父类限定通配符可以接受泛型类型为其超类、本身以及没有泛型类型的赋值,其中没有泛型类型赋值时会有编译警告。 2.对于读写操作。无界通配符无法添加除了null以外的任何对象。...fun m1(t: T) {//可以在泛型类中定义方法,只需要方法的入参泛型化即可。...所以,我们无法在运行时获取任何泛型信息,也无法在运行时做任何类型转换检查。
kotlin修炼指南7之泛型 泛型,是为了让「类」、「接口」、「方法」具有更加通用的使用范围而诞生的,举个例子,假如我们不使用泛型,那么一个List中可以装得下任何对象,这么做的问题就在于,在使用时,需要对类型进行检查...但是这种处理在我们处理泛型业务时,会有很多限制,所以,泛型提供了「型变」来拓展泛型的使用。 协变 协变指的是,当参数具有父子关系时,子类可以作为参数传递,而泛型的上界就是其父类。...看上去好像没错啊,add进去的元素是TextView类型,符合泛型上界的定义啊,但是,这个List的类型定义是<?...类型,我们也可以在运行时获取泛型类型,这个方法是Java和Kotlin都支持的,这个在前面的文章中也提到了。...这个方式是一个很巧妙的获取泛型类型的方法,在Gson中,就是通过它来获取类型的。
这对于泛型类型(如集合)以及函数类型最有用。...已绑定的可调用引用 现在可以使用 :: 操作符来获取指向特定对象实例的方法或属性的成员引用。 以前这只能用 lambda 表达式表示。...现在你可以在同一个文件中的任何地方定义一个密封类的子类,而不只是以作为密封类嵌套类的方式。 数据类现在可以扩展其他类。...泛型枚举值访问 现在可以用泛型的方式来对枚举类的值进行枚举: //sampleStart...在 Kotlin 1.1 中,你可以限制这种情况,以使只有在 td 的隐式接收者上定义的方法 会在传给 td 的 lambda 表达式中可用。
enum的实例; 定义的每个实例都是引用类型的唯一实例; 可以将enum类型用于switch语句。...4,调用构造方法 ? 5,获取继承关系 ? ? 二十五,泛型 泛型就是编写模板代码来适应任意类型。Java的容器类中大量使用了泛型。...泛型的好处是使用时不必对类型进行强制转换,它通过编译器对类型进行检查。...Java中泛型的实现是使用的擦拭法,编译器编译包含泛型的类时将泛型换成Object类型, 编译器编译泛型实例化的代码时根据泛型的具体类型进行安全转型,而JVM虚拟机对泛型一无所知。...因此泛型的类型不能是int,float,double等基本类型,并且不能够获取泛型的反射。 ? ?
Kotlin泛型与类型安全 跟Java一样,Kotlin也支持泛型类: package com.easy.kotlin /** * Created by jack on 2017/5/30. */...) println(box1.value) Kotlin也可以通过值可以推断出类型(type projections),所以,我们也可以省略类型参数: // 1 的类型是 Int, 编译器可以推断出泛型...extends T 表明这个方法接受 T子类型的对象集合,并非T本身。这意味着,可以从列表中安全的读取T(集合中所有的元素都是T的一个子类),但是我们无法写入因为我们并不知道哪些类是T的子类。...为了最大程度的灵活性,在输入参数时使用通配符类型来表示生产者或者消费者。 关于Kotlin的泛型,更多可以参考[1] 类型别名typealias 类型别名为现有类型提供替代名称。...这个跟Linux的shell中的命令行alias类似。 如果类型名称太长,你可以另外引入较短的名称,并使用新的名称替代原类型名。 它有助于缩短较长的泛型类型。
目录 带有JSDoc注释的TypeScript 激活检查 内联类型 定义对象 定义函数 导入类型 使用泛型 枚举 typeof 从类扩展 带有 JSDoc 注释的 TypeScript 在最优的情况下,...(就像我们在 TypeScript 中所做的那样)内联作为参数。...使用泛型 只要存在可以通用的类型,TypeScript 的泛型语法就可用: /** @type PromiseLike */ let promise; // checks....`then` is available, and x is a string promise.then(x => x.toUpperCase()) 您可以使用@template注释定义更精细的泛型(尤其是带有泛型的函数...特别是在输入泛型时,TypeScript 还有一些功能,但是对于很多基本任务,你可以在不安装任何编译器情况下获得很多编辑器的能力。 知道的更多?给我发一条推文。我很高兴在这里添加它们。
领取专属 10元无门槛券
手把手带您无忧上云