码迷,mamicode.com
首页 > 其他好文 > 详细

Kotlin泛型的高级特性

时间:2021-05-24 17:21:37      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:mamicode   存在   运行   图片   image   sim   情况   tar   integer   

Kotlin中是可以将内联函数中的泛型进行实化的。
那么具体该怎么写才能将泛型实化呢?首先,该函数必须是内联函数才行,也就是要用inline
关键字来修饰该函数。其次,在声明泛型的地方必须加上reified关键字来表示该泛型要进行
实化。

inline fun <reified T> getGenericType() {
}

getGenericType()函数直接返回了当前指定泛型的实际类型。T.class这样的语法在Java
中是不合法的,而在Kotlin中,借助泛型实化功能就可以使用T::class.java这样的语法了。

inline fun <reified T> getGenericType() = T::class.java
fun main() {
val result1 = getGenericType<String>()
val result2 = getGenericType<Int>()
println("result1 is $result1")
println("result2 is $result2")
}

运行结果:
result1 is class java.lang.String
result2 is class java.lang.Integer

Android中的实际用法:

inline fun <reified T> startActivity(context: Context) {
	val intent = Intent(context, T::class.java)
	context.startActivity(intent)
}

startActivity<TestActivity>(context)

泛型的协变

参数列表是接收数据的地方,因此可以称它为in位置
返回值是输出数据的地方,因此可以称它为out位置
技术图片
定义了一个MyClass<T>的泛型类,其中A是B的子类型,同时 MyClass<A> 又是 MyClass<B> 的子类型,那么我们就可以称MyClass在T这个泛型上是协变的。

在泛型T的声明前面加上了一个out关键字。这就意味着现在T只能出现在out位置上,而不能出现在in位置上,同时也意味着SimpleData在泛型T上是协变的。

open class Person(val name: String, val age: Int)
class Student(name: String, age: Int) : Person(name, age)
class Teacher(name: String, age: Int) : Person(name, age)

class SimpleData<out T>(val data: T?) {
fun get(): T? {
	return data
}
}

fun main() {
	val student = Student("Tom", 19)
	val data = SimpleData<Student>(student)
	handleMyData(data)
	val studentData = data.get()
	println(studentData?.name)
	println(studentData?.age)
	}
	fun handleMyData(data: SimpleData<Person>) {
		val personData = data.get()
	}

泛型的逆变

泛型在协变时只出现在out位置上,逆变时只出现在in位置上,就不会存在类型转换异常的情况

interface Comparable<in T> {
operator fun compareTo(other: T): Int
}

Kotlin泛型的高级特性

标签:mamicode   存在   运行   图片   image   sim   情况   tar   integer   

原文地址:https://www.cnblogs.com/androidsuperman/p/14802436.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!