使用 EnumSet<RouteOptions.HazardousGoodType!>

问题描述

我正在使用 HERE MAPS SDK PREMIUM V3.18.3 并且我正在尝试使用 routeOptions.truckShippedHazardousGoods = RouteOptions.HazardousGoodType.COMBUSTIBLE 获取卡车路线 这给出了一个错误说明: 类型不匹配。 必需的: EnumSet 成立: RouteOptions.HazardousGoodType

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 for the Hazmat 并获取正确的条目和 COMBUSTABLE 的常量。

但是就像我说的,当我离开 !在 EnumSet

如果我把!我得到这个错误: 枚举类不能从类继承 这个类型有一个构造函数,因此必须在这里初始化

我不确定我错过了什么?我查看了 HERE.com 文档,我发现 this API ref 但它也忽略了 !来自 EnumSet链接也只使用 Enum 而不是 EnumSet。我已经尝试过 Enum 但是当发现不匹配类型 Hazmat 并且需要 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 类型) 此方法需要输入参数为 Enum 值的 EnumSet