2016-05-11 1 views
2

У меня есть класс, которые имеют структуру, подобнуюСопоставимые против выбора Номер, Design

class A { 
    String key; 
    Double value; 
} 

Теперь значение может быть двойной, длинный, INT, фракцию и так далее.

Как я должен обрабатывать это в одном классе?

Должен ли я делать стоимость Comparable или Number?

Число, поскольку эти значения расширяются Число, сравнимое, так как я хочу, чтобы этот класс [и значение] был сопоставим.

+0

Как вы бы хотели его использовать? '' 'Сравнительный''' кажется странным выбором для меня ... –

+0

Если вы хотите, чтобы этот класс был сопоставим, вы должны показать, что, говоря« класс A реализует Comparable '. – Andreas

+0

Почему бы просто не хранить 'значение' как' BigDecimal'? – Andreas

ответ

4

Предлагаю вам сделать класс с общим типом <T extends Number>.

class A<T extends Number> { 
    String key; 
    T value; 
} 
+0

Итак, если я создаю экземпляр типа A («a», 2.0d), как это будет обрабатываться? – NooB8374

+1

Должно быть 'new A <> (" a ", 2.0)' или 'new A <> (" a ", 2d)'. Вам не хватает '<>'. Указание '2.0d' является излишним, так как' 2.0' и '2d' являются буквами' double'. – Andreas

+0

@ NooB8374, если вы называете contructor ('A o = new A <> (« a », 2.0d);), он будет работать нормально (autoboxing в действии) (Andreas, спасибо) – Andrew

1

Это зависит только от предположений, которые вы хотите или должны сделать о типе значения:

  • Go для универсального типа T, если вы будете хранить только значение некоторого типа T зафиксированного в каждом использовании контекст.
  • Используйте Number, если экземпляры должны быть гибкими с точки зрения типа значения, только требуя, чтобы он был числовым.
  • Используйте Comparable, если вам нужны значения для сравнения.
  • Используйте Object, если вам не нужно принимать какие-либо конкретные значения.
2

Вы можете использовать generics и оба

class A<T extends Number & Comparable<T>> { 
    String key; 
    T value; 

    public A(String key, T value) { 
     this.key = key; 
     this.value = value; 
    } 
} 

Поскольку Number не Comparable, вы можете использовать intersection types, как показано выше на параметре типа T (Integer, Long, Double) был бы счастлив с этим , а теперь значение - это Number и Comparable

1

Я еще не могу добавить комментарий, так что ... Если вы сделаете то, что сказал Andrew's Answer, инициализация была бы чем-то вроде new A<Double>("a", 2.0d). Лично я предпочитаю определять значение как Number.

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