我有一个下面的程序,我的枚举值为“2”,但它没有按照预期的方式工作。任何帮助将不胜感激。
package com.deepak.streams;
import com.google.common.collect.ImmutableMap;
import java.util.HashMap;
import java.util.Map;
public class Demo2 {
public static void main(String[] args) {
if (Scores.scoreMap.containsKey("2")) {
System.out.println("Contains Value");
} else {
System.out.println("Does not contains Value");
}
}
public enum Scores {
PASS(1), FAIL(2), MATRIC(3), PROMOTED(4);
private Integer alias;
private static final Map<Object, Scores> scoreMap;
Scores(Integer iAlias) {
alias = iAlias;
}
static {
final Map<Object, Scores> tmpMap = new HashMap<Object, Scores>();
for(final Scores scores : Scores.values()) {
tmpMap.put(scores.alias, scores);
tmpMap.put(scores.name(), scores);
}
scoreMap = ImmutableMap.copyOf(tmpMap);
}
public Integer getAlias() {
return alias;
}
public static Scores getStudentScoreEnum(Integer intVal) {
return getScores(intVal);
}
public static Scores getStudentScoreEnum(String strVal) {
return getScores(strVal);
}
private static Scores getScores(Object objVal) {
if(null != objVal && !scoreMap.containsKey(objVal)) {
throw new IllegalArgumentException("Unknown Value: " + objVal);
}
return scoreMap.get(objVal);
}
}
}
答案 0 :(得分:3)
您的地图密钥是Object
:
final Map<Object, Scores> tmpMap = new HashMap<Object, Scores>();
这意味着它可以是任何Java Object
。当您使用put
两次时:
tmpMap.put(scores.alias, scores);
tmpMap.put(scores.name(), scores);
您的地图现在将包含两个新密钥。第一个是Integer
,因为参数scores.alias
是Integer
。第二个是String
。
当您在"2"
上执行查找时,它找不到Integer
密钥,因为"2"
是String
,"2".equals(x)
任何false
不是x
的{{1}}是String
。简而言之,字符串"2"
不等于Integer
2。
如果您确实想要使用整数的String
表示来查找键,那么在添加到地图时,您需要使用String
作为键。那就是:
tmpMap.put(scores.alias.toString(), scores);
最好的办法是将地图声明为String
键,而不是Object
,以便在编译时捕获这样的问题 - 除非你真的希望能够使用Integer
和String
值来进行查找。
答案 1 :(得分:0)
您的地图包含整数2
的绑定,而不是字符串"2"
。名称映射将为"MATRIC" -> enumValue
。