我有一个枚举,我为它创建的反向查找表为所有值返回null。我在创建查找表后添加了一个断言,当然,它是空的。我觉得这是一个简单而明显的东西,我忽略了因为我对所有的枚举使用了这个完全相同的结构,并且它们工作正常。
public enum TerrainType {
ROAD(1),
PLAINS(2),
FOREST(3),
MOUNTAINS(4);
private static final Map<Byte,TerrainType> lookup = new HashMap<Byte,TerrainType>();
private final byte terrainId;
static {
for(TerrainType type : EnumSet.allOf(TerrainType.class)) {
lookup.put(type.getByte(),type);
}
assert lookup.get(1) != null; // <--- THIS ASSERT FIRES, WHY?
}
TerrainType(int id) {
assert id > 0 && id < 128: "ID must be from 1 to 127";
this.terrainId = (byte) id;
}
public static TerrainType get(int id) {
return lookup.get(id);
}
public byte getByte() {
return this.terrainId;
}
}
答案 0 :(得分:3)
文字1是一个整数。
这很有效。
assert lookup.get(Integer.valueOf(1).byteValue()) != null
或者,您可以将terrainId
更改为int
答案 1 :(得分:0)
这对我来说很好。请注意更改。
我建议不要使用assert来强制执行合同。如果您收到意外输入,请抛出IllegalArgumentException
。
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
public enum TerrainType
{
ROAD(1),
PLAINS(2),
FOREST(3),
MOUNTAINS(4);
private static final Map<Integer, TerrainType> lookup = new HashMap<Integer, TerrainType>();
private final int terrainId;
static
{
for (TerrainType type : EnumSet.allOf(TerrainType.class))
{
lookup.put(type.getTerrainId(), type);
}
assert lookup.get(1) != null; // <--- THIS ASSERT FIRES, WHY?
}
TerrainType(int id)
{
assert id > 0 && id < 128 : "ID must be from 1 to 127";
this.terrainId = id;
}
public static TerrainType lookupById(int id)
{
return lookup.get(id);
}
public int getTerrainId()
{
return this.terrainId;
}
}
class TerrainTypeDriver {
public static void main(String[] args)
{
for (int i = 0; i < 6; ++i) {
System.out.println(TerrainType.lookupById(i));
}
}
}
答案 2 :(得分:0)
基本上它是等于(对象)的问题。
引用Java API:
“如果此映射包含从键k到值v的映射,使得(key == null?k == null:key.equals(k)),则此方法返回v;否则返回null”
试试这段代码:
int a = 1;
byte b = (byte) a;
Byte c = b;
boolean d = c.equals(1);
System.out.println(d);