2014-09-29 3 views
2

Пожалуйста, помогите мне обернуть мою голову вокруг, почему это не работает. (Это не является практической проблемой, это психическое Excercise для OCPJP экзамена.)Java: авто-unboxing в сочетании с отливкой

public class ImplicitConversions { 

Integer iBoxed; 
short sPrimitive = (short)iBoxed; 

} 

// ошибка компилятора: несовместимые типы; требуется: short, found: Integer

Я предполагаю, что компилятор пытается выполнить первый раз (или раньше) unboxing, тогда как, например, арифметическая операция (iBoxed + iBoxed) сначала распаковывает ее. Поэтому можно ли с уверенностью сказать, что авто-бокс/распаковка занимает свое место в порядке операций (Unary, Arithmetic, Relational, Logical, Conditional, Assignment) и где именно?

Я читал о преобразовании конверсии в источнике ниже (чтобы убедиться, что я совместим с 1.6), но это ускользает от меня. Благодарю. http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html#20232

+0

Вы выбрасываете в префицирующий тип данных, это недопустимо –

+1

@MuhammadRamahy Как это должно работать? Нет отношения наследования между «Integer» и «Short». 'short sPrimitive = (Short) iBoxed;' даже не будет компилироваться, а в то время как 'short sPrimitive = (Short) (Object) iBoxed;' компилируется, это бесполезно, что проверка типа компилятора была обойдена. Будет выбрано исключение времени выполнения. – 5gon12eder

+0

Вы правы. Я не знаю, почему я так сказал. –

ответ

6

Этот

(short)iBoxed 

является самостоятельным выражением, которое не зависит от контекста. То, что вы пытаетесь сделать, отличает Integer значение ссылки до примитивного значения short. That's just not a casting context that is allowed. (См. Таблицу ниже в главе.)

+0

+1 - для интересной ссылки. – OldCurmudgeon

2

Integer имеет способ shortValue(). Используйте вместо этого:

short sPrimitive = iBoxed.shortValue(); 
2

Ап/распаковка выражение авто-бокс не может быть совмещена с wider- или уже дальности броска.

Однако, вы можете дважды бросить переменную iBoxed:

short sPrimitive = (short) (int) iBoxed; 

Первая переменная iBoxed является автоматическим распакованный к int, а затем int преобразуется в short.

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