Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Kotlin中定义字符串或Int的映射?_Kotlin - Fatal编程技术网

如何在Kotlin中定义字符串或Int的映射?

如何在Kotlin中定义字符串或Int的映射?,kotlin,Kotlin,有没有办法声明一个在Kotlin中同时接受字符串和Int的映射?比如: var map: Map<String, String | Int> var映射:映射 您可以在此处使用任何,请参见此示例: import java.util.TreeMap 主要内容(){ var map=TreeMap() 地图放置(“一”,1) 地图放置(“二”,“二”) println(地图) } 哪个输出 {One=1,Two=Two} 请注意: 这将允许更多的类型,而不仅仅是所需的字符串和Int

有没有办法声明一个在Kotlin中同时接受字符串和Int的映射?比如:

var map: Map<String, String | Int>
var映射:映射

您可以在此处使用
任何
,请参见此示例:

import java.util.TreeMap
主要内容(){
var map=TreeMap()
地图放置(“一”,1)
地图放置(“二”,“二”)
println(地图)
}
哪个输出

{One=1,Two=Two}
请注意:

这将允许更多的类型,而不仅仅是所需的
字符串
Int
,因为状态(…)。每个Kotlin类都有一个作为超类的Any。

Kotlin中没有联合类型,因此不能直接表示这一点

有几个选择:

  • 使用
    TreeMap
    ,这是最简单的,但它允许的类型不仅仅是
    Int
    String
    ,并且在访问值时需要消费者端的额外转换样板文件

  • 使用自定义的
    密封类
    封装“
    Int
    String
    ”类型,并在常规的
    树映射中使用它。这将为每次插入/访问包装/展开int/string对象带来一些运行时开销。此外,这也给消费者带来了(非)包装的负担。这就是说,与
    Int
    String
    相比,您的域可以更好地用更清晰的名称进行建模,因此定义此类类型实际上可能会改善消费者的体验

  • 使用自定义映射类型,对int和string使用独立的访问器,但在幕后使用单个
    TreeMap
    。这样做的优点是封装了逻辑,并为消费者提供了一个整洁的API。如果扩展
    TreeMap
    ,与合成相比,您将节省一些开销,但这并不重要

  • 不过,我想知道手头的实际用例。通常,对联合类型的需求源于使用普通泛型基元类型来表示有意义的域数据,而这些域数据可以更好地使用更具体的自定义域类型来表示


    因此,选项2通常是我的选择,但我会使用一个实际表示域数据的密封类,而不是通用的“string或int”。

    但它也允许添加
    map.put(“One”,listOf(“error”))
    @AlexCraft是的,它允许。。。这允许kotlin认为
    Any
    Any
    事物。也许你可以用它来验证类型?
    String
    Int
    之间最接近的交集是
    Any
    。你的实际用例是什么,需要在地图的值中进行这样的混合?难道不是比int和string更好的类型更合适吗?@Joffrey联合类型有很多用例(例如在TypeScript中使用的)。我想知道他们是否也存在于科特林。谢谢。我问的是关于模拟这种情况的一般情况。我来自具有联合类型的TypeScript,我想知道Kotlin中是否有类似的功能。虽然需要更多的样板文件,+1表示“更好……使用更具体的自定义域类型表示”。在大多数情况下,对这个特殊的“我该怎么做…”问题的最佳答案是“你不需要”。适用于类型系统较弱和/或表达能力较弱的语言的模式和技术并不总是能很好地翻译成Kotlin,通常有更好的方法。使用类型系统,不要对抗它@AlexCraft密封类可能是最接近TypeScript的联合类型的类。也就是说,一个主要的区别是您必须定义新的自定义类型作为密封类的一部分;不能“联合”现有类型,如int或string。关于在Kotlin中引入联合类型,曾进行过多次讨论,但我不确定它们是否会很快再次被考虑,因为它们在JVM上没有合适的表示形式,它将为许多Kotliners通常希望避免的设计打开大门。@TypeScript中的gidds类型系统并不比Kotlin中的typesystem弱,也不比Kotlin中的typesystem表现力差。没有必要称Kotlin为缺点,因为没有联合类型是一件积极的事情。