一,背景
常规情况下,使用泛型方法时不能直接访问泛型的具体类型,
举一个例子:定义一个泛型方法,这个方法的功能是打印 value 的值,同时打印value的 class 类型。
fun <T> getValue(value: T) {
print("value 的值为 ${value};value 的类型为 ${T::class.java}")
}
这时会报错:Cannot use ‘T’ as reified type parameter. Use a class instead,意思是不能使用 T 作为具体化的类型。
如果我们想在方法内部访问泛型的具体类型怎么办?kotlin 中提供了关键字 reified,使用 reified 修饰泛型后,就允许我们在方法内部使用泛型的具体类型了。(注意reified需要搭配inline使用)
二,reified 的作用:在方法内部访问泛型的具体类型
如果想在方法内部访问泛型的具体类型,使用关键字 reified 修饰泛型,同时方法声明为内联函数,这样就可以在方法内部访问泛型的具体类型了,如下:
inline fun <reified T> getValue(value: T) {
print("value 的值为 ${value};value 的类型为 ${T::class.java}")
}
然后调用该方法打印一个具体字符串:
class Utils {
fun main() {
getValue("name")
}
inline fun <reified T> getValue(value: T) {
print("value 的值为 ${value};value 的类型为 ${T::class.java}")
}
}
打印输出:value 的值为name; value 的类型为String.class。
三,为什么在 reified 修饰的泛型 T 的方法内部可以拿到泛型的具体类型
上面的代码,反编译的代码如下:
public final class Utils {
public final void main() {
Object value$iv = "name";
int $i$f$getValue = false;
String var4 = "value 的值为 " + value$iv + ";value 的类型为 " + String.class;
System.out.print(var4);
}
// $FF: synthetic method
public final void getValue(Object value) {
int $i$f$getValue = 0;
StringBuilder var10000 = (new StringBuilder()).append("value 的值为 ").append(value).append(";value 的类型为 ");
Intrinsics.reifiedOperationMarker(4, "T");
String var3 = var10000.append(Object.class).toString();
System.out.print(var3);
}
}
main 方法中直接内联了 getValue 方法的内部逻辑,直接将泛型的具体类型 String.class 硬编码到了 main 方法中,即访问到了调用泛型方法时泛型的具体类型。
四,使用场景:
1,封装 startActivity 方法
不使用 reified 时,启动 activity 需要 class 对象,我们必须手动传进来,因为我们无法知道泛型在使用时的具体类型。
fun <T: Activity> Activity.startActivity(clazz: Class<T>) {
startActivity(Intent(this, clazz))
}
使用 reified 时,启动 activity 时可以直接拿到泛型方法使用时泛型的具体类型,不需要将 class 手动传进来。
inline fun <reified T : Activity> Activity.startActivity() {
startActivity(Intent(this, T::class.java))
}
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)