我如何滥用泛型与公共beanutils?

时间:2012-02-29 00:53:01

标签: java generics apache-commons-beanutils

我有两个简单的界面:

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设置id工作正常,其他时候,我得到一个例外,因为它无法找到Id的“写”方法。似乎在反射期间它找到了Serializable的getter,但不是Long,并且它找不到Serializable的setter。它并不是这样做的,所以我怀疑调用person.getClass()。getDeclaredMethod(“id”)并不总是返回相同的方法,但我可能错了。

无论如何,这种不一致的行为真的令人抓狂,因为,例如,它可以在Eclipse中工作,但不能在Maven中工作,或者它可以工作很长时间,然后在其他地方进行一些无关的更改,它将停止工作。

很明显,我不太了解泛型以了解正在发生的事情,但有人可以向我解释并解释如何解决它吗?

2 个答案:

答案 0 :(得分:2)

我使用的Apache Commons BeanUtils的版本不支持Java 5,所以它不了解泛型,桥接方法等等。我相信这是问题,你使用的是哪个版本的BeanUtils?它是Java 5+意识到的吗?

答案 1 :(得分:0)

我对这个设计并不在意 - 我不喜欢只为getter和setter设置接口。

我也没有那个接口扩展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; }        
}