首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HashTable问题

HashTable问题
EN

Stack Overflow用户
提问于 2014-07-14 11:02:06
回答 6查看 2.7K关注 0票数 6

我有一个有趣的问题,需要使用Hashtables;我正在为S40诺基亚开发(兼容级别1.4)。

我期望Hashtable如何工作:

代码语言:javascript
复制
Hashtable table = new Hashtable();
table.put(1, "Hello World");

然而,我得到了错误:

类型为put(Object, Object)的方法Hashtable不适用于参数(int, String)

但是,当我创建一个对象引用并传递引用时,它工作得很好!为什么?!

工作实例:

代码语言:javascript
复制
Hashtable table = new Hashtable();
Integer test = new Integer(1);
table.put(test, "Hello World");

任何解释都会很好!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-07-14 12:04:57

在我的回答中,我假设您的实际代码实际上如下:

代码语言:javascript
复制
Hashtable table = new Hashtable();
table.put(1, "Hello World");

这就是导致您所描述的错误的代码,即

类型为put(Object, Object)的方法Hashtable不适用于参数(int, String)

原因是:

  1. Java1.4不支持仿制药,因此Hashtable只使用Objects (作为键和值)。
  2. Java1.4不支持自动拳击,因此代码table.put(1, "Hello World")不会自动装箱到table.put(Integer.valueOf(1), "Hello World")。因此,您正在尝试调用与table.put(int, String)不兼容的Hashtable.put(Object, Object)

瞧。

如果使用Java 1.5+,则调用将自动装箱到table.put(Integer, String)

顺便说一下,做而不是使用new Integer(1),总是更喜欢静态工厂方法 Integer.valueOf(1)。您可以避免不必要地创建冗余类。这就是将自动装箱编译成的内容。参见:静态工厂方法与实例(正常)构造函数?

票数 4
EN

Stack Overflow用户

发布于 2014-07-14 11:18:24

从你提到的错误信息来看,

类型Hashtable中的方法put(Object,Object)不适用于参数(int,String)。

很明显,编译器在初始化Integer对象之后将其视为原语值。也就是说,它立即应用取消装箱。这可能是为了优化移动平台,如果我能找到它的参考,我会更新我的答案。

票数 3
EN

Stack Overflow用户

发布于 2014-07-14 11:29:54

您的代码的问题是,正如您提到的,是1.4遵从性,这使我认为您正在编译它以使其兼容1.4。装箱/取消装箱是1.5中添加的特性。

为了让您确认我的意思:尝试用javac --source 1.5 --target 1.5编译您的代码,它会编译得很好,但是在javac --source 1.4 --target 1.4上也会遇到抱怨。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24735084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档