Типы времени выполнения элементов, возвращаемых из итераторов, не изменяются (и не могут быть изменены). Они назначены полям типа E
, которые могут быть стерты до Object
во время выполнения (в зависимости от общих границ), но это не повлияет на сами объекты.
Когда вызывается equals()
, это нестатический метод, поэтому он вызывается для любого класса объекта next
. Если этот класс не имеет переопределенного метода equals, тогда, конечно, будет использоваться значение по умолчанию Object.equals
. Однако, если класс этого объекта прямо или косвенно переопределяет равные, будет использоваться наиболее специфичное переопределение.
Другими словами, этот код должен быть в порядке (и приведение совершенно не нужно).
Я предлагаю вам еще раз проверить, правильно ли вы переопределили equals
в рассматриваемом классе. Я предполагаю, что вы реализовали это как что-то вроде:
public class MyFoo {
...
public boolean equals(MyFoo other) {
...
}
}
тогда как аргумент должен иметь тип Object , в противном случае вы просто перегружаете метод equals вместо его переопределения. Если вы используете Java 6, вы можете добавить аннотацию @Override
в ваш метод, который будет отлавливать ошибки такого рода.