Мод деление двух целых
Я продолжаю получать сообщение об ошибке "Оператор% не определен для типов аргументов 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;
любая помощь или предложения будут оценены.
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 ввел autoboxing и autounboxing в 1.5, вы должны использовать компилятор Java до версии 1.5, скажем, 1.4.
Решения:
- Обновление до Java 1.5/1.6/1.7.
- Если вы должны использовать 1.4, используйте
Integer.intValue()
извлечьint
значения, по которым вы можете использовать%
оператор.
Это прекрасно работает для меня.
Integer x = Integer.valueOf(10);
Integer y = Integer.valueOf(3);
int z = x % y;
System.out.println(z);
Нет проблем. Выход:
1
Какую ошибку вы получаете? Какую версию Java вы используете? Похоже, что вы используете Java ниже 1,5.
То, что вы пытаетесь здесь, называется распаковкой, автоматическим преобразованием объекта в примитивный тип (другой путь - это автобокс).
Документы 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
). Вполне возможно, будет быстрее использовать примитивный тип, хотя вы, конечно, должны проверить его, чтобы быть уверенным.
Попробуйте преобразовать целые числа в целые, затем запустите %
,
if(table[key.intValue() % tableSize.intValue()] == null)
table[key.intValue() % tableSize.intValue()] = node;