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

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

文章目录 一、泛型类 二、泛型参数 三、泛型函数 四、多泛型参数 五、泛型类型约束 一、泛型类 ---- 定义一个 泛型类 , 将 泛型参数 T 放在 尖括号 中 , 该泛型参数放在 类名后..., 主构造函数之前 , 该泛型参数 T 是 类型占位符 , 在 该泛型类类中 可以使用 类型占位符 T 作为一个类 使用 , 可以 定义 T 类型成员属性 主构造函数中可以接收 T 类型的实例对象作为参数...下面的代码中 , 声明了 Student 泛型类 , 该泛型类 接收 T 类型的泛型参数 , 在主构造函数中接收 T 类型的参数 , 在该泛型类中声明了 T 类型的成员属性 ; class Student...---- 函数 的 参数 或 返回值 类型为 泛型类型 , 则该函数称为 泛型函数 ; 代码示例 : 该代码中 , 泛型函数 logT 的 参数 和 返回值 都是 T 泛型参数 类型 ; class...---- 泛型函数 中 如果涉及到 匿名函数 参数 , 匿名函数 的 参数返回值 都是泛型 的话 , 在该泛型函数 中可能需要使用多个泛型 , 使用不同的字母表示不同的泛型 ; 如果函数中 引入了新的泛型类型

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

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

    放在 尖括号 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T 是 类型占位符 , 在 该泛型类类中 可以使用 类型占位符 T 作为一个类 使用 , 可以 定义 T 类型成员属性...主构造函数中可以接收 T 类型的实例对象作为参数 , T 类型可以 作为函数的返回值 ; 通常情况下 , 泛型参数 都使用 T 表示 , 使用其它字母 或者 字符串 都可以表示 泛型参数 , 但是 约定俗成...都使用 T 来表示泛型 ; 代码示例 : 下面的代码中 , 声明了 Student 泛型类 , 该泛型类 接收 T 类型的泛型参数 , 在主构造函数中接收 T 类型的参数 , 在该泛型类中声明了 T...---- 函数 的 参数 或 返回值 类型为 泛型类型 , 则该函数称为 泛型函数 ; 代码示例 : 该代码中 , 泛型函数 logT 的 参数 和 返回值 都是 T 泛型参数 类型 ; class...---- 泛型函数 中 如果涉及到 匿名函数 参数 , 匿名函数 的 参数返回值 都是泛型 的话 , 在该泛型函数 中可能需要使用多个泛型 , 使用不同的字母表示不同的泛型 ; 如果函数中 引入了新的泛型类型

    4.1K10

    深入浅出Go泛型之泛型使用三步曲

    2.2 使用空接口并通过类型断言来判定具体的类型 另外一种方法是函数接收一个空接口的参数。在函数内部使用类型断言和switch语句来选择是哪种具体的类型。最后将结果再包装到一个空接口中返回。...因为无论是调用者处理返回值还是在函数内部的实现代码都需要将具体的类型包装在一个空接口中,并使用类型断言来判断接口里的具体的类型。...3.1 第一步:类型参数化 在定义泛型函数时,使用中括号给出类型参数类型,并在函数所接收的参数中使用该类型参数,而非具体类型,就是所谓的类型参数化。...](f) 在该示例中,函数StringifyFloat是一个泛型函数,并使用StringableFloat接口来对T进行约束。...在调用泛型函数时,需要给函数的类型参数指定具体的类型,叫做类型实例化。

    72630

    《现代Typescript高级教程》泛型和类型体操

    number 在上面的示例中,identity 函数使用类型参数 T,并返回与输入类型相同的值。...number 在上面的示例中,ReturnType 类型接受一个类型参数 T,并使用条件类型和 infer 关键字推断函数类型的返回类型。...我们还可以结合泛型和内置泛型函数来实现更复杂的类型操作。以下是一个示例,展示了如何使用 Pick 和泛型来创建一个函数,该函数从给定对象中选择指定属性,并返回一个新的对象。...它返回一个新类型,该新类型包含在 T 中存在但不在 U 中存在的成员类型。...Omit Omit 是 TypeScript 中的另一个内置泛型函数,它返回一个新类型,该新类型排除了类型 T 中指定的属性 K。

    37630

    Java 8 函数式接口使用示例及相关新特性

    2、一个新注解 如果现在某一个接口就是为了函数式接口而生的,定义的时候就让其只有一个抽象方法,所以有了一个新的注解:函数式接口@FunctionInterface 3、四种类型 在jdk8中,引入了一个新的包...Function: 接收参数,并返回结果,主要方法 R apply(T t) Consumer: 接收参数,无返回结果, 主要方法为 void accept(T t) Supplier: 不接收参数,但返回结构...Function 表示一个方法接收参数并返回结果。... void accept(T t, int value) 以下三个类,接收一个泛型参数,一个指定类型的参数 ObjLongConsumer void accept(T t, long value...(x * 2)); } 输出: 6 三、Function功能型函数式接口 Function接口 接受一个输入参数T,返回一个结果R。

    1.7K20

    TypeScript 中的泛型

    泛型函数(Generic Functions)使用泛型来创建一个可以处理不同类型的函数:实例function identity(arg: T): T { return arg;}// 使用泛型函数...构造函数和方法都可以使用泛型类型 T。通过实例化 Box,我们创建了一个存储字符串的 Box 实例,并通过 getValue 方法获取了存储的值。4...."); // 输出: 5// 错误的使用,因为数字没有 length 属性logLength(42); // 错误解析: 在这个例子中,定义了一个泛型函数 logLength,它接受一个类型为 T 的参数...); // 推断为 number 类型说明: 这个例子展示了带有默认值的泛型函数。...函数 defaultValue 接受一个泛型参数 T,并给它设置了默认类型为 string。在使用时,如果没有显式指定类型,会使用默认类型。

    14710

    深入理解 Java 中的 Lambda

    它必须包含一个名为apply的函数。 函数返回类型必须是void。 函数必须接受一个String类型可以转换到的对象的参数。...泛型函数类型 就像使用集合一样,泛型为函数类型增加了大量的功能和灵活性。实现功能上的算法而不考虑类型相关信息,泛型函数类型使其变为可能。在对map函数的实现中,会在下面用到这种功能。...函数可以被分配给它: OneArgumentInterface meth = LambdaMap::oneStringArgumentMethod; 通过使用泛型函数类型,它现在可以以一种通用的方法实现算法..., "X "); 实现map 在诸多高阶函数中,map是最经典的. map的第一个参数是函数,该函数可以接收一个参数并返回一个值;第二个参数是值列表. map使用传入的函数处理值列表的每一项,然后返回一个新的值列表...与Python不同,在Java中必须首先考虑map第一个参数的类型:一个可以接收一个参数并返回一个值的方法。参数的类型和返回值的类型可以不同。

    1.1K20

    TypeScript手记(五)

    基础示例 下面来创建第一个使用泛型的例子:identity 函数。这个函数会返回任何传入它的值。你可以把这个函数当成是 echo 命令。...identity(arg: any): any { return arg } 使用 any 类型会导致这个函数可以接收任何类型的 arg 参数,但是这样就丢失了一些信息:传入的类型与返回的类型应该是相同的...不同于使用 any,它不会丢失信息,像第一个例子那像保持准确性,传入数值类型并返回数值类型。 我们定义了泛型函数后,可以用两种方法使用。...:泛型函数 loggingIdentity,接收类型参数 T 和参数 arg,它是个元素类型是 T 的数组,并返回元素类型是T 的数组。...泛型函数的类型与非泛型函数的类型没什么不同,只是有一个类型参数在最前面,像函数声明一样: function identity(arg: T): T { return arg } let myIdentity

    93710

    Go 泛型之类型参数

    二、返回切片中值最大的元素 我们先来看一个例子,实现一个函数,该函数接受一个切片作为输入参数,然后返回该切片中值最大的那个元素。...我们继续 maxGenerics 泛型函数为例分析,它拥有一个类型参数 T,在常规参数列表中,T 被用作切片的元素类型;在返回值列表中,T 被用作返回值的类型。...函数传入的实际参数为 []int{…} 时,Go 编译器会将其类型 []int 与泛型函数参数列表中对应参数的类型([]T)作比较,并推断出 T == int 这一结果。...maxGenerics 泛型函数的一次调用,Go 对这段泛型函数调用代码的处理分为两个阶段,如下图所示: 我们看到,Go 首先会对泛型函数进行实例化(instantiation),即根据自动推断出的类型实参生成一个新函数...另外要注意,当我们使用相同类型实参对泛型函数进行多次调用时,Go 仅会做一次实例化,并复用实例化后的函数,比如: maxGenerics([]int{1, 2, -4, -6, 7, 0}) maxGenerics

    28710

    终于搞懂TS中的泛型啦!!

    假设我们有一个名为 identity 的函数,它接受一个参数并返回该参数: function identity(value: T): T { return value; } 在上述代码中..., 表示这是一个泛型函数,T 是一个类型参数,可以是任何类型。...示例 2 和示例 3 展示了如何使用泛型函数并指定参数的类型。 。 # 2. 使用泛型变量: 泛型变量允许我们在函数或类中使用一种不确定的类型,而在实际使用时才确定具体的类型。...举个例子,考虑一个简单的函数identity,它接受一个参数并返回相同的值: function identity(arg: T): T { return arg; } 在这个例子中,我们使用了泛型变量...我们定义了一个泛型函数reverse,接受一个数组参数,并返回反转后的数组。

    41920

    泛型会让你的 Go 代码运行变慢

    总而言之,字典中包含所有必需的类型元数据,用来将参数进一步传递给其他泛型函数,由此实现函数到 / 自接口的转型。其中对用户影响最大的就是如何在泛型函数上调用方法。...它会接收*interfacetype 与*itab 作为两项参数,并仅当给定 itab 中的接口也实现了我们的目标接口时、才返回给定 interfacetype 的 itab。不知道大家能否明白?...所以,我们得到一个明确的结论:千万别把接口传递给 Go 中的泛型函数。即使在最理想的情况下,即接口与约束完全匹配时,指向类型的每一次方法调用都会产生大量开销。...至于这次优化的结果可能大家已经猜到了,基本没任何效果。实例化泛型函数的 shape 并不特定于我们的回调,而是 func(rune) 回调的泛型 shape,同样不支持任何类型的内联。...这样没用,因为所有指针类型都拥有同一个可传递至泛型函数的 shape;相关方法信息放置在运行时字典当中。 在任何情况下,都不要将接口传递给泛型函数。

    1.1K20

    我也浅谈【泛型参数】的【晚·绑定late bound】

    【泛型函数】的【泛型·生命周期·参数】都是【晚·绑定】, 【泛型函数】是一个【成员方法】且引用了由其所属【泛型类型】(比如,结构体)声明的另一个【泛型·生命周期·参数】(有点绕儿,看 [例程3])。...于是,该【泛型函数】使用的这个【生命周期·参数】就是【早·绑定】的。 lifetime bound出现。...于是,该【泛型函数】的这两个【泛型·生命周期·参数】(限定的·与·被限定的)皆都是【早·绑定】。 要么,忽略【泛型·生命周期·参数】的存在。...特别是,当一个函数同时有多个·引用类型·形参输入和·引用类型·返回值输出时,【泛型·生命周期·参数】就必须被声明和使用,否则编译错误。...因为明确了类型,也就明确了如何实例化该类型。而【泛型类型】【生命周期·参数】的关键作用就是以该类型【实例】的生命周期为“已知量”,推断它的·引用类型·字段值生命周期的“未知量”。

    1K20

    泛型会让你的 Go 代码运行变慢

    总而言之,字典中包含所有必需的类型元数据,用来将参数进一步传递给其他泛型函数,由此实现函数到 / 自接口的转型。其中对用户影响最大的就是如何在泛型函数上调用方法。...它会接收*interfacetype 与*itab 作为两项参数,并仅当给定 itab 中的接口也实现了我们的目标接口时、才返回给定 interfacetype 的 itab。不知道大家能否明白?...所以,我们得到一个明确的结论:千万别把接口传递给 Go 中的泛型函数。即使在最理想的情况下,即接口与约束完全匹配时,指向类型的每一次方法调用都会产生大量开销。...至于这次优化的结果可能大家已经猜到了,基本没任何效果。实例化泛型函数的 shape 并不特定于我们的回调,而是 func(rune) 回调的泛型 shape,同样不支持任何类型的内联。...这样没用,因为所有指针类型都拥有同一个可传递至泛型函数的 shape;相关方法信息放置在运行时字典当中。 在任何情况下,都不要将接口传递给泛型函数。

    1.2K40

    泛型_TypeScript笔记6

    一.存在意义 考虑这样一个场景,identity函数接受一个参数,并原样返回: function identity(arg) { return arg; } 从类型上看,无论参数是什么类型,返回值的类型都与参数一致...三.泛型函数 类型变量也叫类型参数,与函数参数类似,区别在于函数参数接受一个具体值,而类型参数接受一个具体类型,例如: function identity(arg: T): T { return...{ (arg: string): string }; 像是接口形式类型描述的退化版本,没有复用优势,也不如箭头函数简洁,因此,并不常见 四.泛型接口 带类型参数的接口叫泛型接口,例如可以用接口来描述一个泛型函数...idArray: (...s: number[]) => s, }; 接口级的类型参数有这种约束作用,成员级的则没有(仅作用于该泛型成员) 五.泛型类 同样,带类型参数的类叫泛型类,例如: class...(T extends constraintInterface),比如上面要求类型参数T必须具有一个number类型的length属性` 另一个典型的场景是工厂方法,例如: // 要求构造函数c必须返回同一类

    1.1K30

    【Rust学习】23_泛型类型、特征和生命周期

    这种抽象让我们在编译时不必知道具体的类型是什么,泛型的真实类型将在代码被实例化时确定。函数确实可以接收泛型类型的参数,而不是像 i32 或 String 这样的具体类型。...我们使用了 Result,它用来表示操作可能成功(返回 T)或失败(返回 E)。在本章中,您将深入了解如何利用泛型来定义自己的类型、函数和方法。...接着,我们会应用类似的技术,将两个只在参数类型上有所区别的函数合并为一个泛型函数。此外,我们还将探讨如何在结构体(struct)和枚举(enum)的定义中运用泛型类型。...在深入探讨泛型语法之前,我们先来看一个不涉及泛型的情况,如何通过提取函数来删除重复代码,这个函数将特定值替换为一个能代表多个值的占位符。接着,我们将应用相同的技术来提取泛型函数。...定义泛型函数:将重复代码提取到函数体中,并在函数签名中指定该代码的输入和返回值。调用函数:更新重复代码的两个实例以改为调用该函数。接下来,我们将采用类似的方法来利用泛型减少代码重复。

    7610

    Kotlin学习之路(4)函数的运用

    public 表示该函数为公共方法,而Kotlin默认就表示函数是公开的,所以省略了关键字 ③ Java使用 void表示该函数没有返回值,而Kotlin中没有关键字void ,若没有返回值不用特别声明...【几种特殊的函数】 泛型函数 按照之前的例子,函数的输入参数类型必须定义函数的时候需要指定 例如:var int_array:Array = arrayOf(1,2,3) 定义泛型函数的时候...,就跟调用arrayOf方法一样,只需在函数名称后面加类型>即可 内联函数 前面我们定义的泛型函数appendString时,是把它作为一个全局函数,也就是在类外定义,而不是在类内部定义。...因为类的成员依赖于类,只有泛型类才能拥有成员泛型函数,而普通类是不允许定义泛型函数的,否则编译器直接报错。...如果要让该方法同事接收整型和双精度的数组入参,那就得使用泛型T 来自于基类Number 将改为,同时在fun前面加上关键字inline,表示该函数属于内联函数

    74810

    Swift 进阶: 泛型

    唯一的区别是它们接收值类型不同( Int 、String 和Double )。 写一个可以交换任意类型值的函数会更实用、更灵活。泛型代码让你能写出这样的函数。(下文中定义了这些函数的泛型版本。)...Swift 是类型安全的语言,不允许(例如)一个String 类型的变量和一个Double 类型的变量交换值。尝试这样做会引发一个编译错误。 3. 泛型函数 ---- 泛型函数可以用于任何类型。...泛型 Where 分句写在一个类型或函数体的左半个大括号前面。 下面的例子定义了一个叫做allItemsMatch 的泛型函数,用来检查两个Container 实例是否包含相同顺序的相同元素。...上面的例子创建了一个Stack 实例来存储 String 值,压到栈中三个字符串。还创建了一个Array 实例,用三个同样字符串的字面量初始化该数组。...这个泛型下标有如下限定: 在尖括号中的泛型形式参数Indices 必须是遵循标准库中Sequence 协议的某类型; 下标接收单个形式参数,indices ,它是一个Indices 类型的实例; 泛型

    1.7K20
    领券