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
MutableMap<;字符串,有吗?>;在Kotlin中使用委托时将值传递给var?_Kotlin - Fatal编程技术网

MutableMap<;字符串,有吗?>;在Kotlin中使用委托时将值传递给var?

MutableMap<;字符串,有吗?>;在Kotlin中使用委托时将值传递给var?,kotlin,Kotlin,以下示例代码来自一个网页。我知道这些变量、城市和国家通过委托获得价值 我不明白map:MutableMap是如何将值传递给这些vars\u id、city和country的 我必须先将这些键的值传递给map吗?例如地图[“_id”]=132L,地图[“城市”]=“芜湖”和地图[“国家”]=“美国” 如果没有地图[“_id”],会发生什么?代码var\u id:Long by map是否会导致错误 class CityForecast(val map: MutableMap<String,

以下示例代码来自一个网页。我知道这些变量、城市和国家通过委托获得价值

我不明白map:MutableMap是如何将值传递给这些vars\u id、city和country的

我必须先将这些键的值传递给map吗?例如地图[“_id”]=132L,地图[“城市”]=“芜湖”和地图[“国家”]=“美国”

如果没有地图[“_id”],会发生什么?代码
var\u id:Long by map
是否会导致错误

class CityForecast(val map: MutableMap<String, Any?>, val dailyForecast: List<DayForecast>) {
    var _id: Long by map
    var city: String by map
    var country: String by map

    constructor(id: Long, city: String, country: String, dailyForecast: List<DayForecast>)
        : this(HashMap(), dailyForecast) {
        this._id = id
        this.city = city
        this.country = country
    }
}
class CityForecast(val地图:可变地图,val每日预测:列表){
var\u id:Long by map
var城市:按地图排列
var国家/地区:按地图字符串
构造函数(id:Long,城市:String,国家:String,dailyForecast:List)
:此(HashMap(),dailyForecast){
这个.\u id=id
这个城市
这个国家
}
}

首先,您需要了解委托财产是如何运作的。对象不直接拥有委托属性。它只拥有代理。例如,
var\u id:Long by map
实际上看起来像

var _id: Long
    get() {
        val value = map["_id"] as? Long
        if (value == null)
            throw Excecption()
        return value        
    }
    set(value) {
        map["_id"] = value
    }
我必须先将这些键的值传递给map吗?例如地图[“_id”]=132L,地图[“城市”]=“芜湖”和地图[“国家”]=“美国”

不,这是一个运行时检查,就像
lateinit
一样

如果没有地图[“_id”],会发生什么?代码var\u id:Long by map是否会导致错误

class CityForecast(val map: MutableMap<String, Any?>, val dailyForecast: List<DayForecast>) {
    var _id: Long by map
    var city: String by map
    var country: String by map

    constructor(id: Long, city: String, country: String, dailyForecast: List<DayForecast>)
        : this(HashMap(), dailyForecast) {
        this._id = id
        this.city = city
        this.country = country
    }
}
当然,也会有例外

请注意,这是而不是推荐用于普通课堂。它是为JSON反序列化而设计的(不过我还是更喜欢GSON)。不建议这样做,因为您正在创建可以避免的潜在运行时异常,包括缺少值和类型检查

此外,如果不需要显式地使用
HashMap()
,则应使用
mutableMapOf()
而不是
HashMap()

检查并确认。