首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin的类型具体化使Java或Scala不可能实现什么?

Kotlin的类型具体化使Java或Scala不可能实现什么?
EN

Stack Overflow用户
提问于 2017-12-17 04:03:40
回答 1查看 4.3K关注 0票数 12

我最熟悉Java类型擦除(包括它的所有问题和好处)。我对Kotlin的类型系统的扩展可能性有一些有限的了解,但我不清楚类型具体化是如何在面向擦除的JVM上工作的。什么是类型具体化,Kotlin如何使它在JVM上成为可能,这与Java的类型擦除和Scala的复杂类型系统有什么不同?

EN

回答 1

Stack Overflow用户

发布于 2017-12-17 08:35:41

当Kotlin插入泛型函数时,它自然会用调用的类型替换类型参数。例如用inline fun <T> foo(x: T) = ...

代码语言:javascript
复制
foo(File("."))

变成了

代码语言:javascript
复制
val x = File(".")
// body of foo with File used everywhere T was

reified所做的只是允许在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无法实现的事情,例如:

  1. 在递归函数中使用ClassTags
  2. 将它们存储在集合中,然后使用它们调用ClassTag-using函数。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47852106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档