- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我是 Kotlin 的新手。当我学习 Storing Properties in a Map .我尝试以下用法。
class User(val map: MutableMap<String, String>) {
val name: String by map
}
class User(val map: MutableMap<String, in String>) {
val name: String by map
}
class User(val map: MutableMap<String, out String>) {
val name: String by map
}
前两个都可以,最后一个失败。使用 out
修饰符,getName
的字节码如下:
public final java.lang.String getName();
0 aload_0 [this]
1 getfield kotl.User.name$delegate : java.util.Map [11]
4 astore_1
5 aload_0 [this]
6 astore_2
7 getstatic kotl.User.$$delegatedProperties : kotlin.reflect.KProperty[] [15]
10 iconst_0
11 aaload
12 astore_3
13 aload_1
14 aload_3
15 invokeinterface kotlin.reflect.KProperty.getName() : java.lang.String [19] [nargs: 1]
20 invokestatic kotlin.collections.MapsKt.getOrImplicitDefaultNullable(java.util.Map, java.lang.Object) : java.lang.Object [25]
23 checkcast java.lang.Object [4]
26 aconst_null
27 athrow
Local variable table:
[pc: 0, pc: 28] local: this index: 0 type: kotl.User
如我们所见,它会导致NullPointerException
。
为什么 map 委托(delegate)上不允许逆变?
为什么 kotlin 没有给我编译错误?
最佳答案
简短回答:这不是编译器中的错误,而是operator getValue()
的签名的不幸结果。为 MutableMap
声明.
长答案: delegating properties由于标准库中的以下三个运算符函数,to maps 是可能的:
// for delegating val to read-only map
operator fun <V, V1: V> Map<in String, @Exact V>.getValue(thisRef: Any?, property: KProperty<*>): V1
// for delegating var to mutable map
operator fun <V> MutableMap<in String, in V>.getValue(thisRef: Any?, property: KProperty<*>): V
operator fun <V> MutableMap<in String, in V>.setValue(thisRef: Any?, property: KProperty<*>, value: V)
这里是 MutableMap
的使用地点差异选择接收者以便可以将某种类型的属性委托(delegate)给可以存储其父类(super class)型的映射:
class Sample(val map: MutableMap<String, Any>) {
var stringValue: String by map
var intValue: Int by map
}
不幸的是,当您尝试使用超出投影的 MutableMap<String, out String>
作为 val
的委托(delegate)属性(property),因此作为 getValue
的接收者运算符(operator),这里会发生什么:
MutableMap<in String, in V>.getValue
选择了重载,因为它具有更具体的接收器类型。out String
类型参数投影它的实际类型参数是未知的(它可以是 MutableMap<..., String>
或 MutableMap<..., SubTypeOfString>
),所以唯一安全的选择是假设它是 Nothing
,它是所有可能类型的子类型。V
已推断为 Nothing
,并且编译器会插入一个检查,确认实际返回的值是 Nothing
类型。 ,这应该总是失败,因为不可能有 Nothing
类型的值.这个检查看起来像 throw null
在字节码中。我打开了一个问题 KT-18789看看我们可以用这个操作符函数的签名来做什么。
UPD:签名已在 Kotlin 1.2.20 中修复
同时作为一种解决方法,您可以使用 MutableMap
至Map
,因此 getValue
的第一个重载被选中:
class User(val map: MutableMap<String, out String>) {
val name: String by map as Map<String, String>
}
关于delegates - 为什么 kotlin 不允许协变 mutablemap 成为委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44665427/
我的问题是更多地了解文档。上面写着: fun Map.forEach( action: (Entry) -> Unit) 但是我不明白如何实现它。如何在循环中获取 Key 和 Value? 我想对
我有一个名为 translations 的 MutableMap。我想将其克隆到另一个 MutableMap 或 Map 中。我使用以下方法完成了此操作:translations.map { it.k
在文档中,我看到我们有一个mutableMap的setValue。 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/se
我将 JSON 加载的对象存储在 MutableMap 中,以便能够通过它的键获取一个对象(JSON 中带有 id 字段) > 对象): [{id: 1, name: "Red"}, {id: 2,
在 kotlin 标准库中我们有 MutableMap 接口(interface)有这个方法 public abstract fun put(key: K, value: V): V? 如果它接受不可
这是食谱应用程序的一部分。我在我写的食谱课上。成分是我写的另一门课。这个想法是将成分及其数量(作为 Int)存储在映射中。 在类主体中,我将 map 声明为: var ingredients: Map
我目前有像dsl这样的类,并且具有构建能力 class GRLMessage { var headerMap : MutableMap = mutableMapOf() lateini
这是食谱应用程序的一部分。我在我写的食谱课上。成分是我写的另一门课。这个想法是将成分及其数量(作为 Int)存储在映射中。 在类主体中,我将 map 声明为: var ingredients: Map
我最近在我的 ubuntu 系统上安装了 python3.10,我相信我创建了一个从 /usr/bin/python3 到 /usr/bin/python3.10 的链接 如果我运行 python -
MutableMap.keys属性定义为:abstract val keys: MutableSet 我了解keys的内容会随着底层 map 的变化而变化,但是如何keys它自己可以修改吗? IE :
var chart_values: MutableSet>? = mutableSetOf() 打印 chart_values: [ground={}, ground_level={}, date_o
我按照说明在 Ubuntu 14.04 g2.8xlarge aws 实例上安装 Google Tensorflow 及其依赖项。在尝试运行示例问题时,我遇到了下面发布的错误。任何帮助将不胜感激。谢谢
我不明白 Kotlin 中的 MutableMap 和 Map 有什么区别? 以下代码来自 https://github.com/antoniolg/Kotlin-for-Android-Develo
给定一个嵌套的不可变映射: val someNestedMap = mapOf( 2 to mapOf( "a" to true, "b" to false,
我的可变 map 为 private var optionsList: MutableMap> = mutableMapOf()我需要将它发送到另一个 Activity ,我使用了这个:
通常,我可以随意修改 monkey-patch 和 mock 方法: from UserDict import DictMixin class py2fake_dict(DictMixin):
我希望下面的 SpreadSheet 类被内置的 isinstance() 视为一个 dict 子类,但是当我尝试要这样注册它,将抛出一个 AttributeError 异常(如下所示)。 做这样的事
很多文档都指出了 Kotlin 中 Map 和 MutableMap 之间的区别,但是,我似乎找不到 HashMap 和 MutableMap 之间的区别。它们可以互换使用吗?这2个数据结构的实现水平
我是 Kotlin 的新手。当我学习 Storing Properties in a Map .我尝试以下用法。 class User(val map: MutableMap) { val n
如何转换MutableMap至ObjectDoubleMap使用 Eclipse Collections? 在我的用例中,我有一个可变映射,它是聚合结果。例如; MutableMap map = li
我是一名优秀的程序员,十分优秀!