reified
关键字
作用:
reified 字面意思是具体化,其作用是防止泛形擦除,使得编译后的字节码仍然保留其真实类型
由于 Java 中的泛型存在类型擦除的情况,任何在运行时需要知道泛型确切类型信息的操作都没法用了。
比如你不能检查一个对象是否为泛型类型 T
的实例:
☕️
<T> void printIfTypeMatch(Object item) {
if (item instanceof T) { // 👈 IDE 会提示错误,illegal generic type for instanceof
System.out.println(item);
}
}
这个问题,在 Java 中的解决方案通常是额外传递一个 Class<T>
类型的参数,然后通过 Class#isInstance
方法来检查:
☕️ 👇
<T> void check(Object item, Class<T> type) {
if (type.isInstance(item)) {
👆
System.out.println(item);
}
}
Kotlin 中同样可以这么解决,不过还有一个更方便的做法:使用关键字 reified
配合 inline
来解决:
🏝️ 👇 👇
inline fun <reified T> printIfTypeMatch(item: Any) {
if (item is T) { // 👈 这里就不会在提示错误了
println(item)
}
}
Kotlin
这具体是怎么回事呢?等到后续章节讲到 inline
的时候会详细说明,这里就不过多延伸了。