有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java协议缓冲区3:枚举为映射中的键

不允许将枚举用作映射中的键。这里的PaxType是一个枚举,不允许用作键

enum PaxType {
    ADULT = 0 ;
    CHILD = 1 ;
    INFANT = 2 ;
}

message FlightData {
    map<PaxType, FareType> fareType = 1;
}

共 (3) 个答案

  1. # 1 楼答案

    定义您自己的地图条目类型,例如:

    enum MyEnum {
      FOO = 0;
      BAR = 1;
      BAZ = 2;
    }
    
    message MapEntry {
      MyEnum type = 1;
      int32 count = 2;
    }
    
    message MyMessage {
      repeated MapEntry counts = 1;
    }
    

    您将无法获得map的确切语义或行为,例如将具有相同密钥的重复条目减少到最后接收的值,但您将获得相同的兼容性优势和相同的通用实用程序

  2. # 2 楼答案

    正如维韦克·辛哈(Vivek Sinha)已经说过的,不允许在地图中使用枚举作为键。但是,您可以使用列表并按照定义枚举的相同顺序填充它。例如,当您编写一个使用bioms的游戏时,您希望从世界上的biom typenumber of existing bioms进行映射。这可以通过以下方式实现:

    enum BiomType {
        PLACEHOLDER = 0;
        FOREST = 1;
        DESERT = 2;
    }
    
    message Map {
        repeated int32 biom_distribution = 1;
    }
    

    填充biom_distribution列表时,必须保持枚举中元素的顺序(在本例中为BiomType

  3. # 3 楼答案

    这是不允许的,因为它不适合proto3开放枚举语义。例如,在Java中,如果有映射,则键只能是定义的值之一。如果碰巧从远程客户端/服务器接收到的枚举键值不在定义的值集中,则无法将其放入映射中。这种限制迫使我们要么删除具有未知枚举键的映射项(这与proto3 open enum语义相反),要么一起禁止将枚举作为映射键

    供参考:https://groups.google.com/forum/#!topic/protobuf/ikeldBe60eI