2011-12-29 5 views
2

Я часто встречал вопросы, такие как Java Generics and adding numbers together, и ответ обычно сводится к тому, что вы действительно ничего не можете сделать с Number.Какова цель класса Number?

Sourcecode показывает, что Number в основном представляет собой пустую оболочку, в отличие от примера Object.

На данный момент я не могу представить себе ситуацию, когда использование Number вместо конкретного подтипа имеет значительные (если есть) преимущества. Обычно я начинаю с Number, но сталкиваюсь с проблемами позже, фактически использую его и все равно изменяю его на подтип. Но это может быть только мой ограниченный опыт.

Так что я задаюсь вопросом, какова цель этого класса, а другой является общим предком других числовых типов без реальной функциональности?

ответ

3

As you can see in the Javadocs, это абстрактный класс. По определению, тогда его единственная цель - служить базовым классом для других числовых типов. Существует множество способов (например, intValue()), которые каждый Number подкласс будет иметь, и можно себе представить, писать что-то вроде

if (object instanceof Number) 
    result = ((Number) object).intValue(); 
else if (object instanceof String) 
    result = Integer.parseInt(object.toString()); 

Я думаю, что это о нем. Что еще вы ожидаете?

0

Поскольку все числовые типы Java расширяют Number, а Number предоставляет методы преобразования ко всем другим числовым форматам, программисты Java всегда могут быть уверены, что они могут безопасно конвертировать из одного числового типа в другой. Это очень полезное свойство.

+0

безопасно? ;-) Не уверен в этом. –

+0

Ну, как можно безопаснее ... по крайней мере, у вас не будет исключений! Но, конечно, если вы попытаетесь преобразовать беззаботно, не проверяя диапазоны, или считаете, что проблема усечения и округления может быть проблемой, тогда у вас наверняка возникнут проблемы. – Renato

+2

Если вы действительно хотите сделать это безопасно, сохраните это значение как BigDecimal, а затем используйте различные точные методы (например, BigDecimal # longValueExact). Это вызовет исключение, если размер искомого примитива не сможет правильно сохранить значение. – Saish

0

Абстрактный класс расширен для всех классов, которые представляют числовые примитивные типы, такие как Byte, Short, Integer, Long, Float и Double. Класс содержит абстрактные методы, которые преобразуют значение объекта в любой из других числовых типов. Все эти методы переопределяются числовыми подклассами. Он также содержит методы преобразования числовых типов в строки и наоборот. See

public abstract class java.lang.Number extends java.lang.Object implements java.io.Serializable 
{ 
    //...... 
} 

See a long example that uses the Number class

0

Ну, я хотел это, по крайней мере реализовать Сопоставимые, но я вижу, как Integer.compareTo (SomeNumberType) не может совпадать с SomeNumberType.compareTo (Integer); и поэтому только подклассы реализуют Comparable.

1

Это позволяет следующее:

  1. Выполнить (возможно, с потерями) преобразование от одного типа к другому.
  2. Позволяет писать код клиента для использования более точной формы (long или double) при сохранении меньших значений.
  3. Позволяет промежуточному коду передавать номера, не будучи слишком специфичными (Long) или слишком абстрактным (Object).
  4. Сортировка позволяет масштабировать код с фиксированной точности (Integer) до бесконечной точности (BigInteger) ... но для этого нужно добавить арифметические операции в базовый класс.
  5. Разрешить код клиента потреблять значения, не обращая внимания на изменчивость (Long vs.AtomicLong), если он не хранит ссылки на объекты.
  6. Разрешить альтернативные реализации для представлений чисел, например, написать свой собственный Fraction, который может быть выражен как double.
  7. Позволяет использовать API-интерфейсы курсора, например IntegerCursor. Но имейте в виду, что при использовании этого метода вы должны быть уверены, что код клиента не будет хранить ссылки на номер.
Смежные вопросы