2016-04-21 1 views
1

Я читаю этот 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(); 
} 

Почему нужен автору ввести бросок при получении значения из HashTable если значение уже имело тип Integer?

+0

'Hashtable' возвращает объект, поэтому литье необходимо. – markspace

+6

Это, должно быть, старая книга; это [raw types] (http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html). –

+0

С такой нетипизированной хэш-таблицей к ней может быть добавлен любой тип объекта, а не только целые числа –

ответ

4

В соответствии с использованием в documentation, по умолчанию Hashtable создает хэш-карту, где ключ является объектом типа Object, а также значение, которое имеет тип Object.

Хотя вы размещаете целые значения, когда вы их читаете, у вас нет гарантии того, что представляет собой объект, поэтому вам нужно будет ввести его. Поскольку то, что вы размещаете, может быть отлито для целого числа, кастинг не прерывается.

Альтернативой, которая не требует литья, является использование общей версии.

+0

Или, лучше, используйте новый тип «Карта» вместо Hashtable, который в настоящий момент является наследием. – markspace

0

Вам не понадобится приведение типов, если вы только указали хеш-таблицу, отметив, что вы сохраните в ней целые числа.

Например -

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); 
} 

Edit:

Не заметил книгу OP упоминается довольно старая, когда дженерики не были там в Java.

Так совет ОП - обратитесь к последним ресурсам.

+0

В 2002 году была опубликована книга, в которой предваряется создание дженериков. – BevynQ

0

что-то к вам:

вы читаете this:

Подробнее Мягкая обложка: 240 страниц Издатель: Addison-Wesley Professional ; 1-е издание (18 ноября 2002) Язык: Английский ISBN-10: 0321146530 ISBN-13: 978-0321146533 Продукт

для этой даты, которые могут быть либо java 1.3 or maybe at the most java 1.4

Так что должно быть на самом деле старая книга, фактическая Java HashTable использует дженерик и метод get возвращает параметр класса, а не класс Object

общественность V прибудет (ключ объекта)

поэтому для новой версии Java не требуется литая ...


, пожалуйста, используйте новую литературу, изменения технологии очень быстро ...мы почти здесь с Java 8 и с нетерпением жду 9


Edit:

Ive нашел то, что искал:

в Java 4:

HashTable class метод Get возвращает требуется объект и литье ... enter image description here

но в java 7 например:

HashTable class метод Get возвращает тип V и бросок не надо ...

enter image description here

+0

В Java 5 добавлены общие типы. –

 Смежные вопросы

  • Нет связанных вопросов^_^