为什么Kotlin的具体化功能更好?

为什么Kotlin的具体化功能更好?,kotlin,Kotlin,并且很好地解释了Kotlin如何具体化使我们能够更改如下内容: myJsonString.toData(MyDataClass::class) 致: myJsonString.toData() 但我认为他们两人都不能很好地解释动机。具体化函数是否只因为保存了几个字符而更可取?或者不必将类作为参数传入还有其他好处吗?另一个好处是可以推断类型参数。例如: fun foo(myData: MyDataClass) { ... } foo(myJsonString.toData()) // no

并且很好地解释了Kotlin
如何具体化
使我们能够更改如下内容:

myJsonString.toData(MyDataClass::class)
致:

myJsonString.toData()

但我认为他们两人都不能很好地解释动机。具体化函数是否只因为保存了几个字符而更可取?或者不必将类作为参数传入还有其他好处吗?

另一个好处是可以推断类型参数。例如:

fun foo(myData: MyDataClass) { ... }

foo(myJsonString.toData()) // no need to specify MyDataClass at all

具体化类型参数的另一个优点是,当类型在编译时已知时,它们提供完整的类型信息,包括类型参数

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) }
}
抽象类类型引用:可比{
val类型:类型=
(javaClass.genericSuperclass作为ParameterizedType)。实际类型参数[0]
覆盖有趣的比较对象(其他:类型引用)=0
}
inlinefunprintgenerics(){
val type=object:TypeReference(){}.type
如果(类型为ParameteredType)
type.actualTypeArguments.forEach{println(it.typeName)}
}

printGenerics()
java.lang.Integer

java.util.List最终动机是类型擦除。JVM上的泛型很酷,但只在编译时有用。通过将
具体化
,可以使泛型类型在运行时可用。这就产生了更干净的API,如和yole的答案所示,更干净的DSL(它们使用了大量的具体化),当然还有更简单的实现,它们依赖于类型信息,这些信息通常会被删除,如热键所示

对我来说,“在方法的编译时知道类型”本身并不是动机。诸如键入更少、运行时性能更好、类装入器中的类更少之类的东西,这些似乎都是它们自身的动机。我可能只是没有足够的经验使其具有内在的价值,但是更少的类型注释(@yole's point)和理解类型的泛型参数层次结构(@hotkey's point)仍然属于“更少类型”的动机。再说一次,这很好也很有价值,我只是想知道还有什么别的。
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>