Mod деление двух целых чисел

Я продолжаю получать сообщение об ошибке «Оператор % не определен для типа (ов) аргумента Integer, Integer». Я не совсем понимаю, почему это происходит. Я думал, что, поскольку модульное деление не может возвращать десятичные дроби, целочисленные значения будут в порядке.

Это происходит внутри метода в программе, которую я создаю. Код выглядит следующим образом:

    public void addToTable(Integer key, String value)
{
    Entry<Integer, String> node = new Entry<Integer, String>(key, value);
    if(table[key % tableSize] == null)
        table[key % tableSize] = node;
}

Метод незавершенный, но ошибка возникает в

    if(table[key % tableSize] == null)

и

    table[key % tableSize] = node;

любая помощь или предложения будут оценены.


person user2268305    schedule 25.04.2013    source источник
comment
Какую версию Java вы используете?   -  person durron597    schedule 26.04.2013
comment
Подозреваемый @durron597 верен, и вы используете ‹ 1.5, поэтому используйте ответы ниже.   -  person earcam    schedule 26.04.2013
comment
В Java 1.5 и 1.6 я могу успешно скомпилировать Integer % Integer.   -  person rgettman    schedule 26.04.2013


Ответы (4)


Я мог бы получить пример кода Integer % Integer для успешной компиляции в Java 1.5 и 1.6, но не в 1.4.

public static void main(String[] args)
{
   Integer x = 10;
   Integer y = 3;
   System.out.println(x % y);
}

Это ошибка в 1.4:

ModTest.java:7: operator % cannot be applied to java.lang.Integer,java.lang.Integer
       System.out.println(x % y);
                            ^

Наиболее разумное объяснение состоит в том, что, поскольку Java представила автоупаковку и автораспаковку в версии 1.5, вы должны использовать компилятор Java до версии 1.5, скажем, 1.4.

Решения:

  • Обновите до Java 1.5/1.6/1.7.
  • Если вы должны использовать 1.4, используйте Integer.intValue() для извлечения значений int, для которых вы можете использовать оператор %.
person rgettman    schedule 25.04.2013

Это отлично работает для меня.

Integer x = Integer.valueOf(10);
Integer y = Integer.valueOf(3);

int z = x % y;

System.out.println(z);

Нет проблем. Выход:

1

Какую ошибку вы получаете? Какую версию Java вы используете? Кажется, вы используете Java ниже 1.5.

person durron597    schedule 25.04.2013

То, что вы пытаетесь здесь сделать, называется распаковкой, автоматическим преобразованием объекта в примитивный тип (обратный путь называется автоупаковкой).

В документах Java есть следующее:


Компилятор Java применяет распаковку, когда объект класса-оболочки:

  • Передается как параметр методу, который ожидает значение соответствующего примитивного типа.
  • Присваивается переменной соответствующего примитивного типа.

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

class Test {
    public static void main(String args[]) {
        Integer x = 17;
        Integer y = 5;
        System.out.println (x % y);
        String [] z = new String[10];
        z[x % y] = "hello";
    }
}

Другая возможность заключается в том, что вы используете среду до Java 5, где были введены автоупаковка и распаковка.

Лучше всего в этом случае, вероятно, быть явным и использовать Integer.intValue(), чтобы получить базовый int.

Однако вы также можете рассмотреть возможность использования int (не Integer) для ключа и упаковывать его только в том месте, где вам нужно (когда вы добавляете его в Entry). Возможно, будет быстрее использовать примитивный тип, хотя, конечно, вы должны протестировать его, чтобы быть уверенным.

person paxdiablo    schedule 25.04.2013

Попробуйте преобразовать целые числа в целые, а затем запустите %.

if(table[key.intValue() % tableSize.intValue()] == null)
        table[key.intValue() % tableSize.intValue()] = node;
person Chris Chambers    schedule 25.04.2013