Kotlin:Java 8的哪些功能尚未支持?
是否有关于Java 8功能的最新概述,这些功能在Kotlin中尚不受支持?
例如,调用像Map#putIfAbsent这样的默认方法无法编译(不支持的引用错误):
import java.util.* fun main(args: Array<String>) { val x : Map<Int, Int> = HashMap<Int, Int>() x.putIfAbsent(1, 2) }
如果默认方法被覆盖,它将起作用:
import java.util.* fun main(args: Array<String>) { val x : HashMap<Int, Int> = HashMap<Int, Int>() x.putIfAbsent(1, 2) }
这就是我通过实验发现的结果,但是对于决定是否已经可以从Java 8代码迁移到Kotlin,系统性的概述将是有价值的。
更新:我的例子中的代码是由“Java to Kotlin”转换器创建的。 正如user2235698指出的那样, Map<Int, Int>
是一个不可变的Kotlin映射。 不过,当我将其更改为java.util.Map
映射时,该示例无法编译。 然而,我声称它必须用默认的方法做一些事情,这是误导性的。
由于它超出了这个问题的范围,所以我在这里打开了一个后续问题: java.util.HashMap是否不在Kotlin中实现java.util.Map?
已知的Java 8互操作性问题被作为这个问题的子任务来跟踪
Map
是不可变的 , HashMap
在Kotlin中是可变的,这就是为什么在第一种情况下你不能放置键值对。
更多细节
- 如何将Array <T?>翻译为List <T>?
- Out-projected type'ArrayList <*>'禁止使用'public open fun add(index:Int,element:E):java.util.ArrayList'