0

我有两个简单的接口:

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;
  }
}

我实例化 a person,然后将它传递给BeanUtils我得到奇怪的行为。例如,有时使用 BeanUtils 设置 id 工作正常,而其他时候,我得到一个异常,因为它找不到 Id 的“写入”方法。似乎在反射期间它找到了一个可序列化的吸气剂,但没有找到一个长的,它没有找到可序列化的设置器。它不会始终如一地这样做,所以我怀疑调用 person.getClass().getDeclaredMethod("id") 不会总是返回相同的方法,但我可能错了。

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

显然,我对泛型的理解不足以理解正在发生的事情,但是任何人都可以向我解释它并解释如何解决它吗?

4

2 回答 2

2

我使用的 Apache Commons BeanUtils 版本不支持 Java 5,因此它不知道泛型、桥接方法等。我相信这就是问题所在,您使用的是哪个版本的 BeanUtils?它是否支持 Java 5+?

于 2012-02-29T01:11:42.437 回答
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; }        
}
于 2012-02-29T00:59:54.010 回答