问题描述
我正在使用 HERE MAPS SDK PREMIUM V3.18.3 并且我正在尝试使用 routeOptions.truckShippedHazardousGoods = RouteOptions.HazardousGoodType.COMBUSTIBLE 获取卡车路线
这给出了一个错误说明:
类型不匹配。
必需的:
EnumSet
val routeOptions = RouteOptions()
routeOptions.setTransportMode(RouteOptions.TransportMode.TRUCK)
routeOptions.setHighwaysAllowed(true)
routeOptions.truckHeight = truckHeightMeters
routeOptions.truckLength = truckLengthMeters
routeOptions.truckWidth = truckWidthMeters
routeOptions.truckLimitedWeight = truckLimitedWeightTon
routeOptions.truckTrailersCount = numberOfTrailers
routeOptions.truckShippedHazardousGoods = Hazmat.COMBUSTABLE
routeOptions.speedProfile
routeOptions.routeType = RouteOptions.Type.FASTEST
routeOptions.routeCount = 1
routeOptions.setTruckTunnelCategory(RouteOptions.TunnelCategory.E)
.setTruckLength(truckLengthMeters)
.setTruckHeight(truckHeightMeters)
.setTruckTrailersCount(numberOfTrailers)
所以我创建了一个枚举类:
enum class Hazmat : EnumSet<RouteOptions.HazardousGoodType!> {
COMBUSTABLE {
override fun iterator(): MutableIterator<RouteOptions.HazardousGoodType> {
COMBUSTABLE
return iterator()
}
override val size: Int
get() = 0
},CORROSIVE {
override fun iterator(): MutableIterator<RouteOptions.HazardousGoodType> {
CORROSIVE
return iterator()
}
override val size: Int
get() = 1
},EXPLOSIVE {
override fun iterator(): MutableIterator<RouteOptions.HazardousGoodType> {
EXPLOSIVE
return iterator()
}
override val size: Int
get() = 2
},FLAMMABLE {
override fun iterator(): MutableIterator<RouteOptions.HazardousGoodType> {
FLAMMABLE
return iterator()
}
override val size: Int
get() = 3
},GAS {
override fun iterator(): MutableIterator<RouteOptions.HazardousGoodType> {
GAS
return iterator()
}
override val size: Int
get() = 4
},HARMFUL_TO_WATER {
override fun iterator(): MutableIterator<RouteOptions.HazardousGoodType> {
HARMFUL_TO_WATER
return iterator()
}
override val size: Int
get() = 5
},ORGANIC {
override fun iterator(): MutableIterator<RouteOptions.HazardousGoodType> {
ORGANIC
return iterator()
}
override val size: Int
get() = 6
},OTHER {
override fun iterator(): MutableIterator<RouteOptions.HazardousGoodType> {
OTHER
return iterator()}
override val size: Int
get() = 7
},POISON {
override fun iterator(): MutableIterator<RouteOptions.HazardousGoodType> {
POISON
return iterator()
}
override val size: Int
get() = 8
},RAdioACTIVE {
override fun iterator(): MutableIterator<RouteOptions.HazardousGoodType> {
RAdioACTIVE
return iterator()
}
override val size: Int
get() = 9
},POISONOUS_INHALATION {
override fun iterator(): MutableIterator<RouteOptions.HazardousGoodType> {
POISONOUS_INHALATION
return iterator()
}
override val size: Int
get() = 10
}
}
如果我保留 !在 EnumSet
routeOptions.truckShippedHazardousGoods = Hazmat.COMBUSTABLE
它显示: public final enum class Hazmat : EnumSet
但是就像我说的,当我离开 !在 EnumSet
如果我把!我得到这个错误: 枚举类不能从类继承 这个类型有一个构造函数,因此必须在这里初始化
我不确定我错过了什么?我查看了 HERE.com 文档,我发现 this API ref 但它也忽略了 !来自 EnumSet
编辑!!所以我尝试了这个,它似乎工作正常:
val hazmatCorrosive: EnumSet<RouteOptions.HazardousGoodType> = EnumSet.of(
RouteOptions.HazardousGoodType.CORROSIVE
)
val hazmatExplosive: EnumSet<RouteOptions.HazardousGoodType> = EnumSet.of(
RouteOptions.HazardousGoodType.EXPLOSIVE
)
val hazmatFlammable: EnumSet<RouteOptions.HazardousGoodType> = EnumSet.of(
RouteOptions.HazardousGoodType.FLAMMABLE
)
val hazmatGas: EnumSet<RouteOptions.HazardousGoodType> = EnumSet.of(
RouteOptions.HazardousGoodType.GAS
)
val hazmatHarmfulToWater: EnumSet<RouteOptions.HazardousGoodType> = EnumSet.of(
RouteOptions.HazardousGoodType.HARMFUL_TO_WATER
)
val hazmatOther: EnumSet<RouteOptions.HazardousGoodType> = EnumSet.of(
RouteOptions.HazardousGoodType.OTHER
)
val hazmatOrganic: EnumSet<RouteOptions.HazardousGoodType> = EnumSet.of(
RouteOptions.HazardousGoodType.ORGANIC
)
val hazmatPoison: EnumSet<RouteOptions.HazardousGoodType> = EnumSet.of(
RouteOptions.HazardousGoodType.POISON
)
val hazmatPoisonousInhilation: EnumSet<RouteOptions.HazardousGoodType> = EnumSet.of(
RouteOptions.HazardousGoodType.POISONOUS_INHALATION
)
val hazmaTradioactive: EnumSet<RouteOptions.HazardousGoodType> = EnumSet.of(
RouteOptions.HazardousGoodType.RAdioACTIVE
)
val hazmatCombustable: EnumSet<RouteOptions.HazardousGoodType> = EnumSet.of(
RouteOptions.HazardousGoodType.COMBUSTIBLE
)
MapLoader.getInstance().selectDataGroup(MapPackage.SelectableDataGroup.TruckAttributes)
val coreRouter = CoreRouter()
val routePlan = RoutePlan()
val routeOptions = RouteOptions()
routeOptions.transportMode = RouteOptions.TransportMode.TRUCK
routeOptions.setHighwaysAllowed(true)
routeOptions.truckHeight = truckHeightMeters
routeOptions.truckLength = truckLengthMeters
routeOptions.truckWidth = truckWidthMeters
routeOptions.truckLimitedWeight = truckLimitedWeightTon
routeOptions.truckTrailersCount = numberOfTrailers
if (combustable or corrosive or explosive or flammable or gas or harmfulToWater or other or organic or poisonousInhilation or poison or radioactive) {
try {
routeOptions.truckShippedHazardousGoods = if (combustable) {
hazmatCombustable
} else if (corrosive) {
hazmatCorrosive
} else if (explosive) {
hazmatExplosive
} else if (flammable) {
hazmatFlammable
} else if (gas) {
hazmatGas
} else if (harmfulToWater) {
hazmatHarmfulToWater
} else if (other) {
hazmatOther
} else if (organic) {
hazmatOrganic
} else if (poison) {
hazmatPoison
} else if (poisonousInhilation) {
hazmatPoisonousInhilation
} else if (radioactive) {
hazmaTradioactive
} else return
} catch (e: Exception) {
e.printstacktrace()
}
Toast.makeText(this,"Hazmat routing selected. If you're not currently hauling hazmat,update the vehicle profile.",Toast.LENGTH_LONG).show()
}
routeOptions.speedProfile
routeOptions.isTruckDifficultTurnsAllowed = false
routeOptions.truckRestrictionsMode = RouteOptions.TruckRestrictionsMode.NO_VIOLATIONS
routeOptions.routeType = RouteOptions.Type.FASTEST
routeOptions.routeCount = 1
有没有更好的方法来做到这一点?
解决方法
错误是不言自明的,因为它需要 Enumset 的输入类型,而您输入的是单个 Enum 的值。 让我们更好地理解这一点
EnumSet 是一个专门的 Set 集合,用于处理枚举类,当我们存储枚举值时,它应该始终优先于任何其他 Set 实现。
如果我们想用枚举元素的子集创建一个 EnumSet,我们可以使用重载的 of() 方法。
请查看参数输入类型,它具有 Enum RoutingOptions.HazardousGoodType 的 Enumset 输入类型。
因此,卡车可能载有多种危险材料,因此为了适应此功能,输入参数是 Enumset。
在这种情况下,如我所见,您只使用了一个枚举值,因此可以使用相同的值创建一个 Enumset,然后将其传递给该方法。
请看下面的示例以更好地区分。
public RouteOptions setTransportMode(RouteOptions.TransportMode 模式) 此方法要求输入参数为单个 Enum 值。
public RouteOptions setTruckShippedHazardousGoods(@NonNull
java.util.EnumSet