Как добавить два класса Integer (instanceof)

Я реализовал этот метод:

    public static Object findInstance(Object value);

Метод принимает значение объекта и преобразует тип класса (если возможно) в Integer или Double. После вызова findInstance я хочу проверить тип своего класса, примерно так:

    value.getClass();

Результатом является java.lang.Double или java.lang.Integer (как и ожидалось).

Но я не могу вызвать какой-либо из методов класса Integer (или Double) для этого объекта.

Окончательный результат должен быть:

    value1=findInstance(value1);
    value2=findInstance(value2);
    int sum=value1.intValue()+value2.intValue();
    System.out.println("Sum:"+sum);

Может кто-нибудь объяснить, почему я не могу вызвать метод intValue()?


person user3543145    schedule 16.04.2014    source источник
comment
Потому что тип вашего объекта может быть Integer, но тип вашей переменной — Object.   -  person azurefrog    schedule 17.04.2014
comment
Хорошо, я стремился к этому, но я понятия не имею, как это исправить. После вызова метода findInstance я хочу быть полностью уверен, что у меня правильный тип класса. Тогда у меня есть 2 варианта: 1) изменить прототип на public static void findInstance (значение объекта). Но тогда метод findInstance не вносит никаких изменений. 2) Иметь более одного метода или в основном классе иметь проверку условия, если тип правильный (уродливое и не очень хорошее решение)   -  person user3543145    schedule 17.04.2014


Ответы (2)


Несколько комментариев по этому поводу: Во-первых, azurefrog указывает правильную причину: ваша переменная имеет тип Object, а не тип Number.

Во-вторых: если вы хотите условно вызвать intValue() или doubleValue() для объекта, ваш метод должен возвращать переменную типа Number вместо типа Object.

Третье: я не знаю задачи, которую вы выполняете, поэтому у вас может быть очень веская причина для этого. Тем не менее, постарайтесь написать свой код таким образом, чтобы он не требовал каких-либо операций приведения типов или вызовов instanceof. Обычно наличие этих операций является признаком «дизайнерского запаха». Это может быть не в вашем случае, но это кажется немного подозрительным, по моему не всегда столь скромному мнению.

person Bill Province    schedule 16.04.2014

Обратите внимание, что BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short реализуют числовой интерфейс (эти классы пройдут тест is-a Number), поэтому вам не нужно их «findInstance». Вы можете использовать числовой интерфейс:

if(obj instanceof Number) {
    Number number = (Number) obj;
    int value = number.intValue();
    ...
}
person MGorgon    schedule 16.04.2014