Как я неправильно использую дженерики с beanutils? - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть два простых интерфейса:

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, или оно будет работать в течение долгого времени, а затем с некоторыми не связанными изменениями где-то еще оно перестанет работать.

Очевидно, я не надеваюне достаточно хорошо понимают дженерики, чтобы понять, что происходит, но может ли кто-нибудь объяснить мне это, а также объяснить, как обойти это?

Ответы [ 2 ]

2 голосов
/ 29 февраля 2012

Версия Apache Commons BeanUtils, которую я использовал, не была известна на Java 5, поэтому она не знала об универсальных методах, методах моста и так далее. Я полагаю, что это проблема, какую версию BeanUtils вы используете? и поддерживает ли Java 5+?

0 голосов
/ 29 февраля 2012

Меня не волнует этот дизайн - мне не нравятся интерфейсы только для геттеров и сеттеров.

Я также не хотел бы, чтобы этот интерфейс расширял Serializable; единственная ответственность - лучший совет здесь.

Но я бы попробовал это так:

public interface Identifiable<T extends Serializable> {
    T getId();
    void setId(T newId);
}

public class Person implements Identifiable<Long> {
    private Long id;
    public Long getId() { return this.id; }
    public void setId(Long id) { this.id = id; }        
}
...