为什么Kotlin的功能更好?

时间:2019-02-28 16:01:31

标签: kotlin

The official Kotlin docsthis answer很好地解释了Kotlin reified如何允许我们更改以下内容:

myJsonString.toData(MyDataClass::class)

收件人:

myJsonString.toData<MyDataClass>()

但是我认为这两者都不能很好地解释动机。仅使用reified功能会节省一些字符吗?还是不必将类作为参数传递还有其他好处吗?

3 个答案:

答案 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),并且当然还依赖于类型信息的更简单的实现,这些信息通常会被热键所示擦除。