Почему направление приведения велико к малому у примитивных типов и мало к большому у объектов? - PullRequest
5 голосов
/ 12 августа 2011

В Java нам нужно преобразовать при преобразовании double (большой по объему памяти) в Integer (меньший по объему памяти)

int x = (int) 4.3;

Но в случае объектов, если родительский класс имеет значение "Mammal" (маленький в памяти)размер) и его подкласс - "Человек" (большой по размеру памяти, так как получил больше свойств, чем млекопитающее)

, затем

Mammal m = new Human(); //works without casting

, но преобразование от малого к большому

Human h = (Human) m ; // needs casting 

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 12 августа 2011

Приведение не о размере объекта: это о диапазоне переменной .

Под "диапазоном" я подразумеваю множество различных значений, которые может содержать переменная,Если вы присваиваете одну переменную другой, чей диапазон - это расширенный набор первых, вам не нужно приводить, потому что вы знаете, что назначение будет в порядке.Но когда вы присваиваете одну переменную другой, чей диапазон является подмножеством, вам необходимо выполнить приведение, потому что назначение может быть невозможным.того же размера.Понятно, что все, что вы можете хранить в проволочной корзине, вы можете хранить в ванне.Но не все, что вы можете держать в ванне, можно хранить в корзине.Куча яблок, ты можешь.Но куча изюма, вы не можете - они будут падать через отверстия в корзине.Таким образом, диапазон вещей, которые может вместить ванна, больше, чем диапазон вещей, которые может вместить корзина, даже при том, что оба имеют одинаковый размер.Перемещение будет помещаться в новый контейнер.Вам не нужно проверять при перемещении вещей из корзины в ванну, но вам нужно проверять при перемещении из ванны в корзину, в противном случае вы получите фрукты по всему полу.

В ваших конкретных случаях мы знаем, что каждый человек является млекопитающим, но не каждое млекопитающее является человеком, поэтому диапазон переменной типа Млекопитающее больше, чем диапазон переменной типа Человек.Мы также знаем, что диапазон double (приблизительно 2 ^ 1024 - - (2 ^ 1024)) больше, чем у int (2 ^ 31-1 - -2 ^ 31).Таким образом, присвоение от первого к последнему в любом случае требует приведения, но от последнего к первому - нет.

6 голосов
/ 12 августа 2011

Когда вы используете примитивные типы, вы должны явно разыгрывать, когда есть вероятность, что вы можете потерять информацию.Например, long равно 64 битам, а int равно 32. Преобразование long в int может привести к потере данных (в данном случае 32 бита).

При работе с объектамиэто относительно полиморфизма.Компилятор может гарантировать, что каждый Human является Mammal.Здесь нет проблем.Но он не может гарантировать, что каждый Mammal является Human.Чтобы преобразовать ссылочный тип, вы должны привести явное приведение.

Вы можете увидеть явное приведение как способ сказать компилятору: «Я знаю, вы не можете гарантировать, что это преобразование данных безопасно, но я знаю, что яделать».

1 голос
/ 12 августа 2011
  1. В случае, когда в игру вступает память примитивов. Если вы собираетесь хранить double в int, как в вашем примере, double занимает больше памяти по сравнению с integer. Так что есть вероятность потери данных.. Если вы играете себя, то знаете, что делаете, так что компилятор позволяет это делать.
  2. В случае объекта, там нет места памяти. Просто полиморфизм вступает в игру. Так что вы можете взять подклассобъект в супертип.

    Надеюсь, вы его получите.

...