Сравнение числового объекта неизвестного целочисленного типа - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь сравнить два Object, тип которых неизвестен во время выполнения, но по крайней мере гарантируется, что тип будет иметь некоторую форму Number. Есть ли способ сравнить Object с базовым классом Number без явного приведения объекта к одному из целых типов Java?

Так, например:

Object objectInt1 = (Integer) 5;
Object objectInt2 = (Integer) 6;

if (objectInt1 > objectInt2) {
    // Clearly won't compile
}

if ((Number) objectInt1 > (Number) objectInt2) {
    // This of course won't compile either
}

Единственный способ, с помощью которого я могу решить sh, это использовать instanceof, проверять каждый целочисленный тип и выполнять явное приведение. Но, возможно, есть более чистый способ сделать это.

Ответы [ 3 ]

1 голос
/ 12 января 2020

Если вы знаете, что это будет Number, вы можете использовать:

Object object1 = Integer.valueOf(5);
Object object2 = Float.valueOf(6);

Number number1 = (Number) object1;
Number number2 = (Number) object2;

if (number1.doubleValue() < number2.doubleValue()) {
  System.out.println("number1 < number2");
}

Конечно, вы также можете выполнять кастинг inline.

0 голосов
/ 12 января 2020

Чтобы сравнить что-то, вы должны знать, как это сделать. Таким образом, вы не можете просто взять что-то неизвестное и сравнить его с чем-то другим.

Операторы <> определены только для примитивных типов.

Объекты, предназначенные для сравнения, реализуют сопоставимый интерфейс. Вы можете проверить, что Object реализует его, и вызвать метод compareTo для сравнения объектов одного типа. Все распространенные java числовые типы (Integer, Short, BigDecimal) реализуют Comparable.

0 голосов
/ 12 января 2020

Существует только два «интегральных» типа Number: Integer и Long, и Integer можно смело выражать как Long.

Тип Number имеет метод longValue(), поэтому вы можете безопасно преобразовать его в Number и сравнить результат вызова этого метода:

if (((Number)object1).longValue() > ((Number)object2).longValue())
...