Java枚举问题
我有一个下面的程序,我的枚举值为“2”,但它不能按预期的方式工作。任何帮助都将不胜感激Java枚举问题,java,enums,Java,Enums,我有一个下面的程序,我的枚举值为“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.sc
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);
}
}
}
package com.deepak.streams;
导入com.google.common.collect.ImmutableMap;
导入java.util.HashMap;
导入java.util.Map;
公开课演示2{
公共静态void main(字符串[]args){
if(分数.scoreMap.containsKey(“2”)){
System.out.println(“包含值”);
}否则{
System.out.println(“不包含值”);
}
}
公众普查分数{
及格(1)、不及格(2)、及格(3)、晋升(4);
私有整数别名;
私有静态最终地图;
分数(整数){
别名=iAlias;
}
静止的{
最终映射tmpMap=newhashmap();
对于(最终分数:Scores.values()){
tmpMap.put(scores.alias,scores);
tmpMap.put(scores.name(),scores);
}
scoreMap=ImmutableMap.copyOf(tmpMap);
}
公共整数getAlias(){
返回别名;
}
公共静态分数getStudentScoreEnum(整数intVal){
返回getScores(intVal);
}
公共静态分数getStudentScoreEnum(字符串strVal){
返回getScores(strVal);
}
私有静态分数getScores(对象objVal){
if(null!=objVal&!scoreMap.containsKey(objVal)){
抛出新的IllegalArgumentException(“未知值:+objVal”);
}
返回scoreMap.get(objVal);
}
}
}
您的映射包含整数2
的绑定,而不是字符串“2”
。名称映射将是“MATRIC”->enumValue
您的映射键是一个对象
:
final Map<Object, Scores> tmpMap = new HashMap<Object, Scores>();
您的地图现在将包含两个新键。第一个是整数
,因为参数scores.alias
是整数
。第二个是字符串
当您在“2”
上执行查找时,它不会找到整数
键,因为“2”
是字符串
,而“2”。对于任何非字符串的x
,等于(x)
为假。简单地说,字符串“2”
不等于整数
2
如果确实希望使用整数的String
表示作为键查找键,则在添加到映射时需要使用String
作为键。即:
tmpMap.put(scores.alias.toString(), scores);
最好的方法是将映射声明为具有String
键,而不是Object
,这样类似的问题将在编译时被捕获——除非您真的希望能够同时使用Integer
和String
值进行查找。问题不清楚,预期的行为是什么,发生了什么事?@Dici-如果你看一下主方法,我的枚举中显然有键“2”。当我运行它时,它无法显示实际结果,即它没有打印“Contains Value”.Scores.scoreMap.containsKey(2)您的枚举中有一个整数键2,您正在查询字符串值“2”。作为整数!=字符串,您得到的结果是正确的,并且是预期的。他也可以使用整数作为键,这是我可能更喜欢的,取决于我想要实现的目标。不同意最后一部分。这与地图的类型无关。他只是把scores.name()
的返回值和他定义的别名搞错了。这可以完美地配合这张地图,尽管它不是特别优雅。请注意,Map.get
未选中(将对象
作为参数),所以最后一句话是wrong@Dici当然,错误不是因为地图的类型。但是,虽然他不需要创建键类型字符串
,但最好是这样做,除非有充分的理由不这样做。我们不知道他想在整个程序中完成什么,但可能不包括使用文本“2”
作为键;他似乎更可能要求用户输入,并且允许用户输入数字或枚举名。但我们在这里都只是猜测。@ajb也许,那么这只是一个意见。但是编译时错误仍然是错误的,因为Map.get
是unchecked@Dici它会在tmpMap.put()
上捕获一个错误,第一个参数是整数。此外,如果他创建键类型字符串
,他还应该更改getScores
参数的类型。
tmpMap.put(scores.alias.toString(), scores);