繁体   English   中英

不能初始化Kotlin类属性的延迟初始化

[英]Lazy initialization of Kotlin class property won't compile

我不确定我认为实际上是问题所在。 但是我试图使用lazy作为委托,并且遇到编译器错误

data class Geocode(var latitude: Double, var longitude: Double) : Comparable<Geocode> {


    override fun compareTo(other: Geocode): Int {
        var result = this.latitude.compareTo(other.latitude)
        if (result == 0)
            result = this.longitude.compareTo(other.longitude)
        return result
    }
}

data class HubKt(val position:Geocode) {
}

data class Example(val hubs:Collection<HubKt>) {

    val bounds:Any by lazy {
        object {
            val ne: this.hubs.map { h -> h.position }.max()
            val sw: this.hubs.map { h -> h.position }.min()
        }

    }
}

如果这是java,我希望bounds函数返回一个映射:

public Map<String,Geocode> getBounds() {
        Geocode ne = geos.stream().max(Geocode::compareTo).get();
        Geocode sw = geos.stream().min(Geocode::compareTo).get();
        return ImmutableMap.of("ne",ne,"sw",sw);
}

我认为这个问题是没有使用正确的this 我尝试过this@Authenticate ,这是不行的。 地狱,我什至可能过于复杂了。 感谢您的见解。

根据问题中的当前代码:

data class Bounds(val ne: Geocode, val sw: Geocode)

data class Example(val hubs:Collection<HubKt>) {
    val bounds: Bounds by lazy {
        Bounds(hubs.map { it.position }.max()!!, 
               hubs.map { it.position }.min()!!)
    }
} 

否则,您将无法通过对象表达式创建的Any的匿名后代访问nesw 您需要一个类型化的响应,例如Bounds类或Map (可能会很棘手)。 而且在您的版本中,它们可以为null。 如果您知道列表中至少有一个值,则可以使用!! 断言您知道maxmin的结果不会为空。

您可以执行以下操作,而无需更改地图创建的副本:

data class Example(val hubs:Collection<HubKt>) {
    val bounds: Bounds by lazy {
        Bounds(hubs.maxBy { it.position }!!.position, 
               hubs.minBy { it.position }!!.position)
    }
}    

或者,如果您希望将null作为可能的界限,请使用?. 安全的运算符,而不是!!. 并将Bounds类更改为允许null

data class Bounds(val ne: Geocode?, val sw: Geocode?)

data class Example(val hubs:Collection<HubKt>) {
    val bounds by lazy {
        Bounds(hubs.maxBy { it.position }?.position, 
               hubs.minBy { it.position }?.position)
    }
}

请注意,在上一个示例中,我从val bounds: Bounds删除了类型val bounds: Bounds因为它是可选的,并且类型推断可以很好地解决它。

好吧,我解决了这个问题:2折

语法错误为“未知符号”吗? 我需要=而不是: (DOH!)

  val bounds:Any by lazy {
        object {
            val ne = hubs.map { h -> h.position }.max()
            val sw = hubs.map { h -> h.position }.min()
        }

    }

龙目岛: Hub中的position是由龙目岛产生的吸气剂:

@Getter
@Setter
private Geocode position = new Geocode(50.0,50.0);

改成:

@Setter
private Geocode position = new Geocode(50.0,50.0);

public Geocode getPosition() {
    return position;
}

最终,这是一个集成问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM