【问题标题】:Usage of Kotlin typealias for Map.Entry in MapMap.Entry 在 Map 中使用 Kotlin 类型别名
【发布时间】:2020-03-19 10:42:47
【问题描述】:

在 Kotlin 中,可以为类定义 typealias,因此也可以为 Map<K,V> 定义。假设我有以下内容:

typealias MyMap = Map<String, String>

但是,如果我也想命名地图条目怎么办,如下所示:

typealias MyEntry = Map.Entry<String, String>
typealias MyMap = Map<MyEntry> // error

但是,Kotlin 不接受这一点,因为 Map&lt;K,V&gt; 需要键和值的类型。上图这样的事情可能吗?

【问题讨论】:

  • 如果您只是将其定义为 Map&lt;String, String&gt; 它仍然适用于所有意图和目的。您从MyMap 获得的条目可以引用为MyEntry

标签: kotlin type-alias


【解决方案1】:

没有。这与typealias 无关,而是如何声明generic 类型。

Map 接口需要两种类型 parameters 并且您必须同时提供两种类型,否则会出现错误,如果您想使用 Map 而不是 parameterized 而不是 Key,@ 987654329@ 然后你可以定义自己的Map 类型。

在上述情况下,当您执行Map&lt;MyEntry&gt; 时,您希望语言采用您提供的单一类型参数 (MyEntry) 并提取其两个组件(String 和 @987654334 @) 然后将这两个组件用作两个不同的type parameters 用于Map。对不起,你问得太多了。

MyEntry 是一个单一的type,它只能这样使用。下面是一个例子

typealias MyMap = Map<MyEntry, String>

【讨论】:

  • 没想到这样。您在上面显示的示例是其中一种方法,RobCo 对我的问题的评论显示了另一种方法。感谢您的思考!
【解决方案2】:

真正的答案是mightyWOZ,但也许这个技巧也有帮助:

您仍然可以在类型别名中使用泛型来转发参数之一:

typealias StringMap<T> = Map<String, T>

【讨论】:

    猜你喜欢
    • 2020-05-28
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    相关资源
    最近更新 更多