我最熟悉Java类型擦除(包括它的所有问题和好处)。我对Kotlin的类型系统的扩展可能性有一些有限的了解,但我不清楚类型具体化是如何在面向擦除的JVM上工作的。什么是类型具体化,Kotlin如何使它在JVM上成为可能,这与Java的类型擦除和Scala的复杂类型系统有什么不同?
发布于 2017-12-17 08:35:41
当Kotlin插入泛型函数时,它自然会用调用的类型替换类型参数。例如用inline fun <T> foo(x: T) = ...
foo(File("."))变成了
val x = File(".")
// body of foo with File used everywhere T wasreified所做的只是允许在foo的主体中使用操作,这些操作只有在替换之后才有意义,但对于非reified类型的参数(如T::class )是非法的。
相关的Scala特性是ClassTag/TypeTag,而不是“复杂的类型系统”。实际上,它自动将Class<T> (或TypeToken<T>)作为参数传递,这可以在Java中手动完成,而且经常是这样的。注意,这是一种与reified完全不同的方法。
我不认为reified所做的任何事情在Scala中是不可能的,但是Kotlin方法的优点是更自然的语法:例如,在Scala中,您不能像将classOf[File]那样在ClassTag-using方法中编写ClassTag-using方法。
OTOH、Scala允许使用reified无法实现的事情,例如:
ClassTagsClassTag-using函数。https://stackoverflow.com/questions/47852106
复制相似问题