[英]Kotlin generics on sealed class won't compile with type check fails
[英]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
的匿名后代访问ne
和sw
。 您需要一个类型化的响应,例如Bounds
类或Map
(可能会很棘手)。 而且在您的版本中,它们可以为null。 如果您知道列表中至少有一个值,则可以使用!!
断言您知道max
或min
的结果不会为空。
您可以执行以下操作,而无需更改地图创建的副本:
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.