Kotlin中能否通过typealias基于Map.Entry定义Map类型?
这种方式完全不可行,原因很简单
首先得明确:Kotlin里的Map是一个双参数泛型接口,它的定义是interface Map<K, out V>——必须同时指定键的类型K和值的类型V,只传一个类型参数属于语法错误,编译器根本不会通过。
先理清楚你的实际需求
你已经定义了typealias MyEntry = Map.Entry<String, String>,这部分是没问题的,因为Map.Entry本身就是对应Map<K,V>的键值对类型,这里你把它固定成了String键+String值的条目。
如果你想基于MyEntry定义一个Map,得先明确这个Map的键和值分别是什么类型:
- 如果你的意图是让
Map的键和值都是MyEntry类型,那应该这么写:typealias MyEntry = Map.Entry<String, String> typealias MyMap = Map<MyEntry, MyEntry> // 正确,明确指定了键和值的类型 - 如果是键为
String、值为MyEntry,那就是:typealias MyMap = Map<String, MyEntry> // 同样符合Map的泛型要求
要是你只是想让Map的Entry就是MyEntry?
那其实你一开始的typealias MyMap = Map<String, String>就已经满足需求了!因为这个MyMap的条目类型天然就是Map.Entry<String, String>,也就是你定义的MyEntry,直接用就行:
typealias MyEntry = Map.Entry<String, String> typealias MyMap = Map<String, String> fun test() { val myMap: MyMap = mapOf("a" to "b") val entry: MyEntry = myMap.entries.first() // 完全兼容,没有任何问题 }
为什么typealias MyMap = Map<MyEntry>会报错?
本质是你误解了Map泛型参数的作用:Map<K,V>的参数是键的类型和值的类型,不是“条目类型”。Map的条目类型是由K和V共同决定的,而不是把条目类型传进去当参数。所以只传一个MyEntry给Map,编译器会直接提示你缺少第二个泛型参数,这是无法绕过的语法限制。
内容的提问来源于stack exchange,提问作者trietsch
相关产品推荐
相关产品推荐

