Kotlin类属性的延迟初始化将不会编译

我不完全确定,我认为这是真正的问题。 但我想使用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@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 (这将是icky)。 而且在你的版本中,他们可能是空的。 如果你知道你在列表中至少有一个值,你可以使用!! 断言你知道maxmin的结果不会为空。

您可以在没有地图创建的副本的情况下进行此更改:

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

或者,如果你想要空值作为可能的边界使用?. 安全的运营商而不是!!. 并更改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删除了这个类型,因为它是可选的,并且类型推断可以很好地解决这个问题。

好的,我解决了这个问题:2倍

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

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

龙目岛(Lombok):在Hub position有龙目岛(Lombok)产生的吸气:

 @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; } 

最终这是一个整合问题。