Проблема с методами, объявленными в Object, заключается в отсутствии статической проверки типов при их использовании. То же самое относится к синхронизированным, где обычно блокируется неправильный объект.
В этом случае Object.equals (Object) работает с любыми двумя объектами. Вы использовали коллекцию, пакеты, вместо того, чтобы получить из нее элемент. Важный вопрос не в том, как появилась эта конкретная ошибка, а в том, как мы можем предотвратить ее появление.
Прежде всего, используйте дженерики и назначьте каждый элемент для итерации статически типизированному локальному:
public int countPacks(String flavour) {
// [ The field represents a count. ]
int count = 0;
for(int index=0; index<packets.size(); ++index) {
String packet = packets.get(index);
if (packet.equals(flavour)) {
++count;
}
}
// [The error mesage was printed for each non-match.
// Even this is probably wrong,
// as it should be valid to have no packs of a valid flavour.
// Having the message in this method is actually a bit confused.]
if (count == 0) {
System.out.println("You have not entered a correct flavour");
}
return count;
}
Мы можем привести в порядок это, используя расширенный цикл for.
public int countPacks(String flavour) {
int count = 0;
for(String packet : packets) {
if (packet.equals(flavour)) {
++count;
}
}
if (count == 0) {
System.out.println("You have not entered a correct flavour");
}
return count;
}
Это выглядит яснее, но хороший программист знает свои библиотеки.
public int countPacks(String flavour) {
int count = Collections.frequency(packets, flavour);
if (count == 0) {
System.out.println("You have not entered a correct flavour");
}
return count;
}
Вы также можете рассмотреть Map<String,Integer>
вместо коллекции.