如何在Kotlin中定义字符串或Int的映射?
有没有办法声明一个在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
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
相比,您的域可以更好地用更清晰的名称进行建模,因此定义此类类型实际上可能会改善消费者的体验
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为缺点,因为没有联合类型是一件积极的事情。