不必要的类型转换?

Unnecessary type casting?

我正在读这个 books 并且有一个代码示例让我感到困惑,我在下面描述的片段中令人困惑的部分:

private Hashtable rates = new Hashtable();

void addRate(String from, String to, int rate) {
  rates.put(new Pair(from , to), new Integer(rate)); // Pair is a value object.
}

int rate(String from, String to) {
  Integer rate = (Integer) rates.get(new Pair(from, to)); // The confusing part.
  return rate.intValue();
}

如果值已经是 Integer 类型,为什么作者需要在从 HashTable 获取值时进行类型转换?

根据 documentationHashtable 的默认用法创建一个散列映射,其中键是一个 Object 类型的对象,也是一个 [=11] 类型的值=].

虽然您放置的是整数值,但当您读回它们时,您无法保证对象是什么,因此您需要对其进行类型转换。由于您放置的内容可以转换为整数,因此转换不会失败。

不需要转换的替代方法是使用通用版本。

如果您声明哈希表并提及您将在其中存储整数,则不需要类型转换。

例如 -

Hashtable<String, Integer> numbers = new Hashtable<String, Integer>();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);

Integer n = numbers.get("two");
if (n != null) {
    System.out.println("two = " + n);
} 

编辑:

当 Java 中没有泛型时,没有注意到提到的那本书 OP 已经很老了。

所以给 OP 的建议 - 参考最新资源。

给你的东西:

您正在阅读 this:

Product Details Paperback: 240 pages Publisher: Addison-Wesley Professional; 1 edition (November 18, 2002) Language: English ISBN-10: 0321146530 ISBN-13: 978-0321146533 Product

对于那个日期,可以是 java 1.3 or maybe at the most java 1.4

所以那一定是一本非常古老的书,实际的 java HashTable uses generics and the get 方法 returns class 参数而不是对象 class

public V get(Object key)

所以对于新的 java 版本不需要转换...


请使用新的文学作品,技术变化真快...我们快 java 8 了,期待第 9 次


编辑:

我找到了我要找的东西:

在 java 4:

HashTable class get 方法 returns 需要对象和强制转换...

但在 java 7 例如:

HashTable class 获取方法 returns 不需要 V 类型和转换...