2015-10-10 2 views
1

Вот очень простой пример: я пытаюсь бросить тип объекта к примитивным, как это:Autoboxing/распаковка во время литья Integer в целое, используя «отливать» метод

Object object = Integer.valueOf(1234); 

int result1 = int.class.cast(object); //throws ClassCastException: Cannot convert java.lang.integer to int 

int result2 = (int)object; //works fine 

Это исходный код литой методом класса «Класс»

public T cast(Object obj) { 
    if (obj != null && !isInstance(obj)) 
     throw new ClassCastException(cannotCastMsg(obj)); 
    return (T) obj; 
} 

private String cannotCastMsg(Object obj) { 
    return "Cannot cast " + obj.getClass().getName() + " to " + getName(); 
} 

Почему это происходит? То же самое происходит и с другими примитивами.

Live Example

+4

Ну, документация для 'isInstance' указывает:« Если этот объект класса представляет примитивный тип, этот метод возвращает false ». Поэтому это не удивительно, но документация 'cast' должна сказать, что всегда будет терпеть неудачу для примитивных типов. –

+0

Так что я не должен использовать метод литья для примитивов, а вместо этого использовать его непосредственно с помощью (int)? –

+0

@AnmolGupta: Да, в основном. –

ответ

6

cast не может реально работать хорошо для примитивов, учитывая, что он не может возвращать значение фактического примитивного типа, из-за дженериков в Java ... так что это будет в конечном итоге бокс снова в любом случае , И если вы не назначаете прямо значение int, его также нужно будет поместить в коробку по этой причине.

Так что, в основном, если вы хотите конвертировать в int, просто заказывайте напрямую.

isInstancedocumented это всегда возвращать false для примитивов:

Если Class объект представляет собой примитивный тип, этот метод возвращает false.

... cast, вероятно, тоже должно быть.

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