散列表的问题



我有一个有趣的问题,需要使用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)

原因如下:

  1. Java 1.4不支持泛型,所以Hashtable只与Objects一起工作(既作为键也作为值)

  2. 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包装原语intput(Object, Object)方法需要两个对象,而不是原语和对象。

相关内容

  • 没有找到相关文章

最新更新