gpt4 book ai didi

java - 以整数为键的映射在将 long 值传递给 get 方法时返回 null

转载 作者:搜寻专家 更新时间:2023-11-01 01:35:48 25 4
gpt4 key购买 nike

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 作为参数传递给HashMap 被声明为只有 Integer 作为键。我原以为这里会出现编译错误,因为我觉得这违反了严格的类型。
  2. 当我将包含错误代码的 long 变量作为参数传递给 get映射的 HashMap() 方法返回 null。
  3. 当我将相同的 long 参数向下转换为 int 并将其传递给 HashMap 的 get 方法时,映射返回正确的枚举。

我怀疑 HashMap.get() 方法中的以下行 if (e.hash == hash && ((k = e.key) == key || key.equals(k)))

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

我想了解这里的行为。

最佳答案

The code is compiling even if I pass a long as the parameter to the get method of the HashMap which is declared to have only Integer as the keys. I was expecting a compilation error here, because I somehow feel this violates the strict typing.

你看过Map.get的签名了吗? ?

V get(Object key)

任何对象都可以用作键。关于该设计决策还有其他 Stack Overflow 问题;我稍后会找到一个。

When I pass the long variable containing the error code as the parameter to the get method of the HashMap() the map returns null.

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

When I downcast the same long parameter to an int and pass it to the get method of the hash map, the map returns the proper Enum.

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

基本上,您被可以比较intlong 值这一事实所愚弄——这只是编译器自动提升intlong 为您服务;如果您将 IntegerLong 视为完全独立的类型,它们之间没有自动转换,那么您的 map 的行为就很有意义。

关于java - 以整数为键的映射在将 long 值传递给 get 方法时返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14702870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com