Java枚举问题

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

我有一个下面的程序,我的枚举值为“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);
    }
}

}
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);