The official Kotlin docs和this answer很好地解释了Kotlin reified
如何允许我们更改以下内容:
myJsonString.toData(MyDataClass::class)
收件人:
myJsonString.toData<MyDataClass>()
但是我认为这两者都不能很好地解释动机。仅使用reified功能会节省一些字符吗?还是不必将类作为参数传递还有其他好处吗?
答案 0 :(得分:4)
另一个好处是可以推断出type参数。例如:
fun foo(myData: MyDataClass) { ... }
foo(myJsonString.toData()) // no need to specify MyDataClass at all
答案 1 :(得分:4)
修饰类型参数的另一个优点是,当在编译时知道类型时,它们可以提供完整的类型信息,包括类型参数。
abstract class TypeReference<T> : Comparable<TypeReference<T>> {
val type: Type =
(javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
override fun compareTo(other: TypeReference<T>) = 0
}
inline fun <reified T: Any> printGenerics() {
val type = object : TypeReference<T>() {}.type
if (type is ParameterizedType)
type.actualTypeArguments.forEach { println(it.typeName) }
}
printGenerics<HashMap<Int, List<String>>>()
java.lang.Integer java.util.List<? extends java.lang.String>
请参阅:How to get actual type arguments of a reified generic parameter in Kotlin?
答案 2 :(得分:1)
动机最终是类型擦除。 JVM上的泛型很酷,但仅在编译时有用。使用reified
,可以在运行时使通用类型可用。这会产生更清洁的API,如this post和yole的答案所示,它会产生更清洁的DSL(使用了很多形式的DSL),并且当然还依赖于类型信息的更简单的实现,这些信息通常会被热键所示擦除。