当前位置: 首页 > 知识库问答 >
问题:

将long值传递给get方法时,键为integer的Map返回null

李洋
2023-03-14
import java.util.HashMap;
import java.util.Map;

public class StackOverFlowQuestion {

private static final int ERROR_CODE100 = -100;
private static final int ERROR_CODE101 = -101;
private static final int ERROR_CODE102 = -102;
private static final int ERROR_CODE103 = -103;
private static final int ERROR_CODE104 = -104;

public enum ErrorDetails {

    ERROR_CODE_100(ERROR_CODE100, "Error code 100 Desc", false),

    ERROR_CODE_101(ERROR_CODE101, "Error code 101 Desc", false),

    ERROR_CODE_102(ERROR_CODE102, "Error code 102 Desc", true),

    ERROR_CODE_103(ERROR_CODE103, "Error code 103 Desc", false),

    ERROR_CODE_104(ERROR_CODE104, "Error code 104 Desc", true);

    private int errorCode;
    private String errorMsg;
    private boolean canRetry;

    private ErrorDetails(int errorCode, String errorMsg, boolean canRetry) {
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
        this.canRetry = canRetry;
    }

    public String getErrorMsg() {
        return this.errorMsg;
    }

    public boolean canRetry() {
        return this.canRetry;
    }

    public String toString() {
        return "Error code : " + errorCode + ", errorMsg : " + errorMsg
                + ", canRetry : " + canRetry;
    }
}

private Map<Integer, ErrorDetails> errorMap;

public StackOverFlowQuestion() {
    System.out.println("StackOverFlowQuestion.StackOverFlowQuestion()");

    errorMap = new HashMap<Integer, StackOverFlowQuestion.ErrorDetails>();

    errorMap.put(ERROR_CODE100, ErrorDetails.ERROR_CODE_100);
    errorMap.put(ERROR_CODE101, ErrorDetails.ERROR_CODE_101);
    errorMap.put(ERROR_CODE102, ErrorDetails.ERROR_CODE_102);
    errorMap.put(ERROR_CODE103, ErrorDetails.ERROR_CODE_103);
    errorMap.put(ERROR_CODE104, ErrorDetails.ERROR_CODE_104);

    System.out.println("errorMap : " + errorMap);
}

/**
 * @param args
 */
public static void main(String[] args) {
    long param = -100;
    StackOverFlowQuestion question = new StackOverFlowQuestion();
    System.out.println("question.errorMap : " + question.errorMap);

    System.out.println("question.errorMap.containskey(param) : "
            + question.errorMap.containsKey(param));
    ErrorDetails errorDetails = question.errorMap.get(param);
    System.out.println("errorDetails : " + errorDetails);

    System.out.println("question.errorMap.containskey((int)param) : "
            + question.errorMap.containsKey((int) param));
    ErrorDetails errorDetailsWithInt = question.errorMap.get((int) param);
    System.out.println("errorDetailsWithInt : " + errorDetailsWithInt);

            int paramInt = -100;
    System.out.println("param == paramInt : " + (param == paramInt));
}

}

==============================================================================================================================输出:

StackOverFlowQuestion.StackOverFlowQuestion()

errorMap : {-100=Error code : -100, errorMsg : Error code 100 Desc, canRetry : false, -102=Error code : -102, errorMsg : Error code 102 Desc, canRetry : true, -101=Error code : -101, errorMsg : Error code 101 Desc, canRetry : false, -104=Error code : -104, errorMsg : Error code 104 Desc, canRetry : true, -103=Error code : -103, errorMsg : Error code 103 Desc, canRetry : false}

question.errorMap : {-100=Error code : -100, errorMsg : Error code 100 Desc, canRetry : false, -102=Error code : -102, errorMsg : Error code 102 Desc, canRetry : true, -101=Error code : -101, errorMsg : Error code 101 Desc, canRetry : false, -104=Error code : -104, errorMsg : Error code 104 Desc, canRetry : true, -103=Error code : -103, errorMsg : Error code 103 Desc, canRetry : false}

question.errorMap.containskey(param) : false
errorDetails : null

question.errorMap.containskey((int)param) : true
errorDetailsWithInt : Error code : -100, errorMsg : Error code 100 Desc, canRetry : false

param == paramInt : true

=================================================================================

这里有几个问题我需要澄清

  1. 代码正在编译,即使我将一个long as参数传递给HashMap的get方法,该方法html" target="_blank">声明只有整数作为键。我在这里期待一个编译错误,因为我不知何故觉得这违反了严格的键入。
  2. 当我将包含错误代码的长变量作为参数传递给HashMap()的get方法时,map返回null。
  3. 当我将相同的长参数向下转换为int并将其传递给hash map的get方法时,map返回正确的Enum。

我怀疑HashMap中的下面一行。get()方法if(e.hash==hash

我不确定int==long是否会失败,或者它们对应的包装器会失败。,我甚至在main方法中添加了一个检查来验证int和long变量的相等性。

我想了解这里的行为。


共有3个答案

党权
2023-03-14

您需要将long转换为int。

郑衡
2023-03-14

1.)即使我将long作为参数传递给HashMap的get方法,代码仍在编译中,该方法被声明为只有整数作为键。我希望这里会出现编译错误,因为我觉得这违反了严格的类型。

这里没有编译错误:Map的唯一方法是put方法,其参数由泛型类型限定getcontainsKey接受对象

2.)当我将包含错误代码的长变量作为参数传递给HashMap()的get方法时,map返回null。

调用get(param)时,它将被转换为get(new Long(param))。因此参数永远不等于整数

3.)当我将相同的long参数向下转换为int并将其传递给哈希映射的get方法时,映射返回正确的枚举。

调用get((int)param)时,它将被转换为get(newinteger((int)param))。因此,参数类型现在是正确的,结果就是您所期望的结果。

卢皓轩
2023-03-14

即使我将long作为参数传递给HashMap的get方法,该方法被声明为只有Integer作为键,代码仍在编译。我希望这里会出现编译错误,因为我觉得这违反了严格的类型。

你看Map.get的签名了吗?

V get(Object key)

任何对象都可以作为关键。关于这个设计决策还有其他堆栈溢出问题;我稍后会找到一个。

当我将包含错误代码的长变量作为参数传递给HashMap()的get方法时,map返回null。

是的,它会-因为它将被装箱为Long,而Long不等于整数。因此在地图中找不到该条目。

当我将同一个long参数向下转换为int并将其传递给哈希映射的get方法时,映射返回正确的枚举。

是的,它会-因为它将被装箱到整数,这将等于适当的键。

基本上,你被这样一个事实愚弄了,你可以比较intlong值——这只是编译器自动为你将int提升为long;如果你想到整数Long作为完全独立的类型,它们之间没有自动转换,映射的行为非常有意义。

 类似资料:
  • 问题内容: 我有3个文件main.php,action.js和ajax.php,我在javascript文件中通过ajax调用成功地将某些div单击的内容从main.php更改为ajax.php的内容。看起来像这样: 现在,我需要从action.js中的ajax.php中的函数返回值,因为我想迭代直到该值(请参见上面的代码)。如何将此值从ajax.php传递到action.js。我很困惑我需要什么

  • 问题内容: 我被困在这个我无法完成的非常基本的表单中,我想用文本输入和两个选择控件构建一个搜索表单,并带有一个接受3个参数的路由,这个问题是当我提交形式,它用问号而不是Laravel方式映射参数, 标记 路线 当我提交表格时,将我重定向到 在没有Javascript的情况下,如何使用Laravel方式将这些参数传递给我的路线!:D 问题答案: 最简单的方法就是接受传入的请求,然后在Controll

  • 问题内容: 如何在Java中将值转换为值? 问题答案: 或如果您不必担心null: 在这两种情况下,您都可能会遇到溢出问题(因为Long可以比Integer存储更大的范围)。 Java 8有一个辅助方法来检查溢出(在这种情况下,您会得到一个异常):

  • 我有静态方法在我的类 这就是定义 这里用的是 这是我得到的一个错误 E0167类型为“void(TV_DepthCamAgent::)(int count,int copied_file)”的参数与类型为“void()(int,int)”的参数不兼容 错误C3867“TV_DepthCamAgent::progress_callback”:非标准语法;使用' 我做错了什么?

  • 问题内容: 我想阅读onClick事件值属性。但是当我单击它时,在控制台上会看到类似以下的内容: 我的代码正常工作。运行时,我可以在onClick事件中看到但无法获取它。 我的代码: 如何在React js中将值传递给事件? 问题答案: 简单的方法 使用箭头功能: 这将创建一个新的函数,以正确的参数进行调用。 更好的方法 将其提取到子组件中。在render调用中使用箭头函数的问题是,每次都会创建一

  • 在get方法中尝试在springboot中按id查找行时,收到一个空值。我在这里对数据库的调用是否有误? 存储库- 服务- 控制器-