6

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

任何解释都会很棒!

4

6 回答 6

4

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

Hashtable table = new Hashtable();
table.put(1, "Hello World");

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

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

原因是这样的:

  1. Java 1.4 不支持泛型,因此可以Hashtable简单地使用Objects(作为键和值)

  2. Java 1.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)。您可以避免不必要地创建冗余类。就是自动装箱被编译成的内容。看到这个:静态工厂方法与实例(普通)构造函数?

于 2014-07-14T12:04:57.597 回答
3

从您提到的错误消息中,

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

很明显,您的编译器在初始化之后将 Integer 对象视为原始值。即它立即应用拆箱。这可能是为了优化移动平台而完成的,如果我能找到它的参考,我会更新我的答案。

于 2014-07-14T11:18:24.437 回答
2

正如您所提到的,您的代码的问题在于 1.4 合规性,这让我认为您正在编译它以使其与 1.4 兼容。装箱/拆箱是 1.5 中添加的功能。

只是为了让您确认我的意思:尝试使用 编译您的代码javac --source 1.5 --target 1.5,它会编译得很好,但是尝试使用相同的javac --source 1.4 --target 1.4然后它会抱怨

于 2014-07-14T11:29:54.237 回答
0

我忽略了诺基亚手机中用于 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");
于 2014-07-14T11:09:54.857 回答
0

如前所述,您可能没有在 java 1.5 中引入的自动装箱功能,因为您在合规级别 1.4 上运行。我的建议是将您的 IDEA jdk 设置为 1.4 而不是您当前使用的 1.7。

于 2014-07-14T11:56:16.950 回答
-1

Integer是一个对象。 int不是一个对象,它是一个原始的。该对象Integer包装了原语int。该put(Object, Object)方法需要两个对象,而不是原始对象和对象。

于 2014-07-14T11:07:06.613 回答