我有一个有趣的问题,需要使用Hashtables;我正在为S40诺基亚开发(兼容级别1.4)。
我期望Hashtable如何工作:
Hashtable table = new Hashtable();
table.put(1, "Hello World");然而,我得到了错误:
类型为
put(Object, Object)的方法Hashtable不适用于参数(int, String)
但是,当我创建一个对象引用并传递引用时,它工作得很好!为什么?!
工作实例:
Hashtable table = new Hashtable();
Integer test = new Integer(1);
table.put(test, "Hello World");任何解释都会很好!
发布于 2014-07-14 12:04:57
在我的回答中,我假设您的实际代码实际上如下:
Hashtable table = new Hashtable();
table.put(1, "Hello World");这就是导致您所描述的错误的代码,即
类型为
put(Object, Object)的方法Hashtable不适用于参数(int, String)
原因是:
Hashtable只使用Objects (作为键和值)。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)。您可以避免不必要地创建冗余类。这就是将自动装箱编译成的内容。参见:静态工厂方法与实例(正常)构造函数?
发布于 2014-07-14 11:18:24
从你提到的错误信息来看,
类型Hashtable中的方法put(Object,Object)不适用于参数(int,String)。
很明显,编译器在初始化Integer对象之后将其视为原语值。也就是说,它立即应用取消装箱。这可能是为了优化移动平台,如果我能找到它的参考,我会更新我的答案。
发布于 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上也会遇到抱怨。
https://stackoverflow.com/questions/24735084
复制相似问题