У меня есть два простых интерфейса:
public interface HasId<ID extends Serializable> extends Serializable {
T getId();
}
И
public interface HasLongId extends HasId<Long> {
void setId(Long id);
}
Теперь, если у меня есть класс:
public class Person implements HasLongId {
private Long id;
private String name;
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
И я создаю экземпляр person
, затем передайте его BeanUtils
Я получаю странное поведение.Например, иногда установка идентификатора с помощью BeanUtils работает нормально, а в других случаях я получаю исключение, потому что он не может найти метод write для Id.Кажется, что во время размышления он находит получатель для Serializable, но не Long, и он не находит установщик для Serializable.Он не делает это последовательно, поэтому я подозреваю, что вызов person.getClass (). GetDeclaredMethod ("id") не всегда возвращает один и тот же метод, но я могу ошибаться в этом.
В любом случае, это противоречивоповедение действительно сводит с ума, потому что, например, оно будет работать в Eclipse, но не в Maven, или оно будет работать в течение долгого времени, а затем с некоторыми не связанными изменениями где-то еще оно перестанет работать.
Очевидно, я не надеваюне достаточно хорошо понимают дженерики, чтобы понять, что происходит, но может ли кто-нибудь объяснить мне это, а также объяснить, как обойти это?