2014-11-12 2 views
2

В Java, почему не встроенные классы номеров расширяют друг друга? Должен ли Long Long Integer расширять Short, который расширяет байт, а Double - Float?Почему классы классов Java не расширяют друг друга?

В общем, наследование часто используется, когда есть отношение «есть». Так что каждый Integer длинный? Я думаю так.

Единственное возможное объяснение, о котором я могу думать, это то, что переполнение не будет обрабатываться правильно. Например, (byte)100 + (byte)100 - -112, тогда как (short)100 + (short)100 - 200. Однако кажется, что должна быть лучшая причина, чем сохранение поведения с ошибкой.

+3

«И есть ли каждый целочисленный длинный?» - нет, 'long' в два раза больше в памяти. – August

+0

@August Но это деталь реализации, которая, конечно же, может быть разной. – Ypnypn

+4

Основываясь на [принципе взаимозаменяемости] (http://en.wikipedia.org/wiki/Liskov_substitution_principle), ваши отношения обратные. 'Integer' должен расширять' Long', так как вы всегда можете указать 'Integer', когда его запрашивают' Long', но не наоборот, поскольку некоторые значения 'Long' недопустимы для значений Integer. – DaoWen

ответ

3

Вы вопрос действительно может подойти двумя различными способами:

Если мы говорим о примитивов, то у вас есть отношения в обратном направлении.

Но если вы спрашиваете насчет Integer, Double, Long и т. Д. Классов, то есть связь между всеми числами.

Важно отметить, что числа как объекты в Java проистекают из общего класса Number, найденного here. Не имеет смысла разбить их в иерархии, как то, как вы описали, потому что методы между всеми числами практически одинаковы, несмотря на различные размеры в памяти, которые они занимают.

Короче говоря, иерархии в Java определяются отношениями (обычно методами), которые разделяют классы, а не размер, который они занимают в памяти.

3

Потому что наследование не наследуется. Каждый из перечисленных типов - это отдельный отдельный объект. Наследование не может использоваться, например, для «расширения» 8-битного значения на 32-битный. Все, что у них есть, наследуется от java.lang.Number.

3

Вы могли бы рассмотреть возможность использования наследования, когда есть более «является» отношения между двумя классами - вы можете иметь банковскую систему классов, называемых Account и SavingsAccount - и сберегательный счет это счет. Фактически это означает, что любой объект подкласса также принадлежит суперклассу.

Но между Integer (32-разрядное целое число) и Long (64-разрядное целое) нет такой связи. 32-разрядное целое НЕ НЕ 64-разрядное целое; и 64-битное целое число НЕ НЕ 32-разрядное целое. Поэтому, чтобы предположить, что существует отношение наследования между классом Integer, а класс Long не имеет смысла.

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