我有一个有趣的问题,需要使用Hashtables
;我正在开发S40诺基亚的(符合1.4级)
我期望Hashtable
如何工作:
Hashtable table = new Hashtable();
table.put(1, "Hello World");
但是我得到错误:
然而,当我创建一个对象引用并传递引用时,它工作得很好!为什么? !
Hashtable
类型中的put(Object, Object)
方法不适用于参数(int, String)
工作的例子:
Hashtable table = new Hashtable();
Integer test = new Integer(1);
table.put(test, "Hello World");
任何解释都会很好!
在我的回答中,我认为您的实际代码实际上如下:
Hashtable table = new Hashtable();
table.put(1, "Hello World");
这是导致你所描述的错误的代码,即
类型
Hashtable
中的方法put(Object, Object)
不适用于参数(int, String)
原因如下:
Java 1.4不支持泛型,所以
Hashtable
只与Objects
一起工作(既作为键也作为值)Java 1.4不支持自动装箱,因此代码
table.put(1, "Hello World")
不会自动自动装箱到table.put(Integer.valueOf(1), "Hello World")
。因此,您正在尝试调用与Hashtable.put(Object, Object)
不兼容的table.put(int, String)
。
瞧。
如果您使用Java 1.5+,调用将自动装箱到table.put(Integer, String)
BTW,做不使用new Integer(1)
,总是首选静态工厂方法 Integer.valueOf(1)
。您可以避免不必要地创建冗余类。这个是自动装箱被编译成的内容。看看这个:静态工厂方法vs实例(普通)构造函数?
从您提到的错误消息中,
Hashtable类型中的put(Object, Object)方法不适用于参数(int, String)
很明显,编译器在初始化Integer对象后将其视为原始值。也就是说,它立即应用拆箱。这可能是为了手机平台的优化而做的,如果我能找到参考,我会更新我的答案。
你的代码的问题是,正如你提到的,是1.4兼容,这让我认为你正在编译它是1.4兼容。装箱/拆箱是1.5版本新增的功能。
只是为了让你确认我的意思:试着用javac --source 1.5 --target 1.5
编译你的代码,它会编译得很好,但用javac --source 1.4 --target 1.4
试同样的,然后它会抱怨
我忽略了在Nokia手机中用于Java开发的JVM(我假设是Java ME),但实际上在典型的Java SE环境中,您的代码不应该给出错误,而是警告:您没有使用模板来构造HashTable,因此JVM只假设您的Integer和String是Object类,而不是实际值。
要避免此警告,由于某些原因,您的IDE报告为错误,请使用:
Hashtable<Integer, String> table = new Hashtable<Integer, String>();
table.put(new Integer(1),"Hello World");
如前所述,您可能没有在java 1.5中引入自动装箱特性,因为您运行的是遵从性级别1.4。我的建议是将你的IDEA jdk设置为1.4,而不是你目前使用的1.7。
Integer
是一个对象。int
不是一个对象,它是一个原语。对象Integer
包装原语int
。put(Object, Object)
方法需要两个对象,而不是原语和对象。