我有两个简单的界面:
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中工作,或者它可以工作很长时间,然后在其他地方进行一些无关的更改,它将停止工作。
很明显,我不太了解泛型以了解正在发生的事情,但有人可以向我解释并解释如何解决它吗?
答案 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; }
}