java - 传递给函数并用作字符串映射时,Java 对象映射不会将对象隐式转换为字符串
问题描述
假设一个 HashMap 被定义为:
void defineMap(){
Map options = new HashMap<Object,Object>();
options.put("isValid","true");
options.put("isXYZ","false");
options.put("Size",6.0);
int x = getFromMap(options);
}
现在,当这个映射被传递给一个函数并且在函数的签名中,映射被定义为
static int getFromMap(Map<String, String> options) {
String some_number = "Size";
int val=Integer.parseInt(options.get(some_number));
return val;
}
现在,根据我的理解,两件事情中的一件应该发生了:
java编译器应该抛出一个错误,因为映射定义不同,所以找不到具有相同签名的此类方法映射中定义的所有键和值都应该隐式转换为字符串但是以上都没有发生在我的 Map 中,Double(6.0) 值与 String ("Size") 键一起存储,这导致 ClassCastException 为:
java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String
在我的 getFromMap() 函数中。
帮助我理解为什么在调用函数并将 Map 作为参数传递时没有引发错误,或者为什么没有将值转换为字符串。
为什么 Double 值存储在 <String,String> 映射中
这个问题可以很容易地通过类型检查值或每次转换为字符串来解决。但我想了解为什么会发生上述情况
解决方案
回答您的问题。为什么 Double 值存储在 Map 中
您已经创建了 Map,因此您可以将任何数据类型对象放入此映射中,当您仅放入 6.0 时,它的行为将是两倍,您将其设置为“6.0”,其类类型为 String,如 demo
Object obj="6.0";
System.out.println("type is ="+obj.getClass());
obj=6.0;
System.out.println("type is ="+obj.getClass());
obj=6;
System.out.println("type is ="+obj.getClass());
输出:
type is =class java.lang.String
type is =class java.lang.Double
type is =class java.lang.Integer
所以最好使用 Object 返回类型。
推荐阅读
- python - Keras:如何为验证集抽取随机样本?
- powershell - Exchange PowerShell 从输入文件导出邮箱时出错
- qt - knuminput.h 在 QT Creator 中不可用
- c# - 添加新行后在 Winforms 中合并 DataGridView 单元格
- apache-kafka - kafka-streams :在发送到 kafka 主题之前修改消息结构
- android - 如何摆脱应用程序模块中的模块特定库存储库?
- python - 在一个语句中写入文件是否比多个语句更有效?
- swift - Swift - 使用 URL 下载的低分辨率 firebase 照片
- javascript - 页面对象模型中的 Javascript 执行器
- c# - 解析表达式树