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

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

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

2.9K10

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

文章目录 一、泛型类 二、泛型参数 三、泛型函数 四、多泛型参数 五、泛型类型约束 六、可变参数 vararg 关键字与泛型结合使用 七、使用 [] 运算符获取指定可变参数对象 八、泛型 out 协变...---- 函数 的 参数 或 返回值 类型为 泛型类型 , 则该函数称为 泛型函数 ; 代码示例 : 该代码中 , 泛型函数 logT 的 参数 和 返回值 都是 T 泛型参数 类型 ; class...---- 泛型函数 中 如果涉及到 匿名函数 参数 , 匿名函数 的 参数返回值 都是泛型 的话 , 在该泛型函数 中可能需要使用多个泛型 , 使用不同的字母表示不同的泛型 ; 如果函数中 引入了新的泛型类型..., 需要两个泛型参数来表示其类型 ; T 类型在泛型类中注明 , 可以在该泛型类 Student 中随意使用 , 但是 泛型参数 R 是首次在该函数中使用 , 因此需要在该函数的 fun 关键字...(t: T) } 十、泛型 invariant 不变 ---- 在 泛型类 中 , 如果 既将 泛型类型 作为 函数的参数 类型 , 又将 泛型类型 作为 函数的返回值 类型 , 则在 声明 泛型参数

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

    Kotlin 泛型:类型参数约束

    上一篇文章讲了 Kotlin 泛型:基本使用,接下来我们再进一步了解泛型使用相关的进阶知识。本篇是 Kotlin 泛型类型参数约束的讲解,更多内容可点击链接查看。...Kotlin 泛型:基本使用Kotlin 泛型:类型参数约束系列持续更新中,欢迎关注订阅。...为什么需要类型参数约束在上一篇文章里,我们使用泛型定义了一个泛型列表List,使用这个列表,我们可以在使用的时候,实例化出各种具体类型的列表,比如字符串列表List、整型列表List...什么是类型参数约束对于上述场景,最理想的实现应该满足这些条件:只有数值类型的列表才能调用这个拓展函数拓展函数对「类型参数」所具备的特征有必要的了解,如知道它是一个Number类型因此,我们需要使用泛型参数约束...中的泛型属性也同样变得可空,这使得泛型类在具体实现的时候,需要考虑参数为空的情况,也让编写代码的具体实现变得复杂。

    2.3K31

    Go 泛型之类型参数

    但 Go 泛型方案的实质是对类型参数(type parameter)的支持,包括: 泛型函数(generic function):带有类型参数的函数; 泛型类型(generic type):带有类型参数的自定义类型...和常规参数类似,泛型函数中类型参数也有其作用域范围,这个范围从类型参数列表左侧的方括号[开始,一直持续到函数体结束,如下图所示: 类型参数的作用域也决定了类型参数的声明顺序并不重要,也不会影响泛型函数的行为...函数传入的实际参数为 []int{…} 时,Go 编译器会将其类型 []int 与泛型函数参数列表中对应参数的类型([]T)作比较,并推断出 T == int 这一结果。...像这样在定义中带有类型参数的类型就被称为泛型类型(generic type)。 从例子中的 maxableSlice 类型声明中我们可以看到,在泛型类型中,类型参数列表放在类型名字后面的方括号中。...., Tn constraintN] TypeLiteral 和泛型函数中类型参数有其作用域一样,泛型类型中类型参数的作用域范围也是从类型参数列表左侧的方括号[开始,一直持续到类型定义结束的位置,如下图所示

    28710

    函数指针做函数参数(回调函数)

    #define _CRT_SECURE_NO_WARNINGS #include //回调函数 //第一个参数是一个万能指针,用来接收用户输入的数据------因为我们不知道用户会输入什么样的数据类型...,因此用万能指针 //第二个参数是一个函数指针-------将data数据放入函数中进行操作 void PrintText(void* data,void(*myPrint)(void* )) { myPrint...(data); } //做回调函数的第二个参数 void myPrint(void *data) { //用void*类型指针赋值给其他类型指针要做强制类型转换 int* num = (int*)data...; //回调函数 //第一个参数是一个万能指针,用来接收用户输入的数据------因为我们不知道用户会输入什么样的数据类型,因此用万能指针 //第二个参数是一个函数指针-------将data数据放入函数中进行操作...void PrintText(void* data,void(*myPrint)(void* )) { myPrint(data); } //做回调函数的第二个参数 void myPrint(void

    61020

    Go语言进阶:类型推断、类型断言与泛型的深入探索

    Go语言泛型的基本语法和使用示例定义泛型函数:func 函数名[类型参数列表](参数列表) 返回值类型 { // 函数体 }// 示例:func PrintInt[T int | int64](value...调用泛型函数调用泛型函数时,可以在函数名后面用方括号指定具体的类型参数,也可以省略类型参数,让编译器根据传入的参数类型进行推断。...Go语言泛型的核心特性Go语言泛型的核心特性主要包括以下几点:类型参数化:泛型允许在函数、方法和类型定义中使用类型参数,这些参数在实例化时会被具体的类型所替代。...类型推断:在调用泛型函数或实例化泛型类型时,Go编译器可以自动推断出类型参数的具体类型,从而简化了泛型的使用。类型安全:泛型在编译时进行类型检查,确保类型参数的使用是安全的,避免了运行时类型错误。...不足增加学习曲线:对于新手或是从其他没有泛型特性的语言转过来的开发者,泛型的概念和使用可能会增加学习成本。

    1.4K10

    【Kotlin】函数 ⑤ ( 匿名函数变量类型推断 | 匿名函数参数类型自动推断 | 匿名函数又称为 Lambda 表达式 )

    文章目录 一、匿名函数变量类型推断 二、匿名函数参数类型自动推断 三、Lambda 表达式 一、匿名函数变量类型推断 ---- 定义变量 时 , 如果将变量值 直接赋值给该变量 , 那么就可以 不用显示声明该变量的类型...name = "Tom" "Hello World, $name" } println(helloFun()) } 二、匿名函数参数类型自动推断 ---- 如果 需要...使用 自动类型推断 确定 匿名函数 的 参数类型 , 则在 匿名函数 的 函数体中 , 必须 显示声明 匿名函数 的 变量名 和 变量类型 ; 匿名函数 返回值 类型 , 是根据 匿名函数 函数体 中...参数类型 , 这样就可以使用 类型推断 , 自动推断出 匿名函数 的参数类型 ; 该匿名函数 函数体 最后一行表达式 的 类型 是 String 类型 , 其 返回值类型就是 String 类型 ;...类型推断 , 则在 函数变量 声明时 , 确定 函数参数 类型 , 在 匿名函数 函数体 中 , 确定 函数参数名 即可 , 示例代码如下 : fun main() { val helloFun

    74720

    如何向回调函数中传入其他参数

    如何向回调函数中传参数 最近写JS经常会因为向回调函数中传参而头疼,今天总结一下向回调函数中传参的方法,以后的应用中就不用在到处去找了。 首先构建一个需要向回调函数中传入参数的典型应用。...通过使用Closure,我们通过匿名函数来重新包装返回的对象,同时将需要传入的参数做为新的属性传给回调函数。...第三种方法假设你需要为你的回调函数使用不同的签名,例如Ajax.Net的专家们允许你在回调中使用额外的参数,如果你想从一个换到另外一个并且保持兼容性的话,就要用到下面的写法: 第四种办法其实就是Closure...的一种变体,你不需要显示的声明一个回调函数,而是使用一个匿名函数直接进行你所需要的处理。...如何向回调函数中传参数 总结一下:向回调函数中传入参数的终极办法其实就是利用Closure,这个看来是唯一可行而且比较优雅的方法,下面将Closure的写法列在下面:      var callback

    2.2K10

    利用函数类型实现封装中的回调

    当进行业务逻辑开发的时候,经常要进行封装,封装成独立的类文件,在类文件的属性中预留出函数类型的API 在调用该类文件中某些方法的时候,也根据业务需要调用类属性中的函数, 在主业务中可以传递特定的函数注册到属性中...main import "log" func main() { c := NewConn(callback, callback2) c.Start() } //在当前模块定义的回调函数...string) string { log.Println("i am callback2 ", name) return "hello" } connection.go是封装的类文件,回调类主模块中的函数...package main type Connection struct{ handleFunc func() handleFunc2 func(name string)string } //把被回调函数注册进了封装类的属性中...Connection{ handleFunc: callback, handleFunc2: callback2, } return c } //在进行某些业务时也把回调函数执行了

    2.4K10

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

    作为 函数的返回值 类型 , 则在 声明 泛型参数 类型 时 , 在 泛型参数 前 使用 out 关键字 , 同时 该 泛型类 又称为 生产类 ( 生产接口 ) , 用于生产 泛型类 指定的泛型对象...- 使用 in 关键字 , 可以使 父类泛型对象 赋值给 子类泛型对象 ; 在 泛型类 中 , 如果只将 泛型类型 作为 函数的参数 类型 , 则在 声明 泛型参数 类型 时 , 在 泛型参数 前...Consumer { fun consume(t: T) } 三、泛型 invariant 不变 ---- 在 泛型类 中 , 如果 既将 泛型类型 作为 函数的参数 类型 , 又将...泛型类型 作为 函数的返回值 类型 , 则在 声明 泛型参数 类型 时 , 既不使用 in 关键字 , 又不使用 out 关键字 ; 代码示例 : 在下面的接口中 , 泛型类型 即用于作为 返回值 ,...修饰 泛型 的 inline 函数 中 , 可以 使用 is 判定 泛型参数的具体类型 ; 代码示例 : open class Food open class FastFood : Food() class

    1.7K10

    C#中的泛型(类型参数的约束)

    因为我们的数组中存储的元素类型是不确定的,所以这里我们用到了泛型,其中where T : strut子句约束参数类型T必须为值类型。当然这个程序我们不使用泛型,直接定义Object类型的数组也可以。...下面重点说说C#中泛型类型参数的约束: 在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。 如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。...T:new() 类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。 T: 类型参数必须是指定的基类或派生自指定的基类。...T: 类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。 T:U 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。...于是,我想能不能写一个简单的泛型类,其中里面实现对数值类型的加减乘除四则运算,遇到的问题是 :where子句后面的约束怎么写,我查看的数值型的类Int32等等,它们的基类是Object,如果直接定义一个泛型参数

    3.7K60

    【C++】泛型编程 ③ ( 函数模板 与 普通函数 调用规则 | 类型匹配 | 显式指定函数模板泛型类型 )

    一、普通函数 与 函数模板 的调用规则 - 类型匹配 1、类型匹配 上一篇博客 【C++】泛型编程 ② ( 函数模板与普通函数区别 ) 中 , 分析了 函数参数 类型匹配 下的 普通函数 与 函数模板...的调用规则 ; 为 函数模板 重载了 普通函数 , 普通函数有指定的类型 ; // 使用 template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型...namespace std; // 使用 template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型...二、普通函数 与 函数模板 的调用规则 - 显式指定函数模板泛型类型 1、显式指定函数模板泛型类型 如果 函数调用时 , 显式指定函数模板类型 , 也就是在尖括号 中指定了泛型类型 , 此时 即使...template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型 // 使用函数模板时 ,

    20240

    【C++】泛型编程 ④ ( 函数模板 与 普通函数 调用规则 | 类型自动转换 | 类型自动转换 + 显式指定泛型类型 )

    一、普通函数 与 函数模板 的调用规则 - 类型自动转换 1、函数模板和重载函数 定义了 函数模板 , 该 函数模板 可以接收 任意类型的参数 T , 但是要求这两个参数类型 T 和 返回值类型 T 必须是相同的...; // 使用 template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型 // 使用函数模板时...std; // 使用 template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型 /...二、普通函数 与 函数模板 的调用规则 - 类型自动转换 + 显式指定泛型类型 1、类型自动转换 + 显式指定泛型类型 在上面示例的前提下 , 如果 传入参数 类型分别是 int 和 char , 并且强行指定...泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型 // 使用函数模板时 , 显式类型调用 必须 显式指定所有 泛型类型 的实际类型 template <typename

    29050
    领券