パラメータ化された型で奇妙な動作が発生しています。クラス B を拡張するクラス A があります。A には、クラス Predicate を拡張する内部クラス A1 があります。コードは次のようになります。
public abstract class A<T> extends B<T> {
public T uniqueResult (String param, Object value) {
A1 filter = new A1();
filter.setParam(param);
filter.setValue(value);
return container.query(filter).next();
}
public class A1 extends Predicate<T> {
public boolean match (T bean) {
Object result = BeanUtils.getPropertyValue(bean, fieldName);
return result == null ? null : result.equals(value);
}
}
}
最後に、クラス D は A を拡張し、uniqueResult メソッドを使用します。
public class D extends A<MyVO> {
public MyVO findById (BigDecimal id) {
return uniqueResult("id", id);
}
}
問題は、(A1 内の) match メソッドが MyVO ではなく BigDecimal を受け取ることです。DでuniqueResultメソッドをオーバーライドするとうまくいきますが、なぜこれが起こるのかわかりません。
オーバーライドされた uniqueResult は次のようになります。
public MyVO uniqueResult (final String fieldName, final Object value) {
return container().query(
new Predicate<MyVO>() {
private static final long serialVersionUID = 1L;
public boolean match(MyVO bean) {
Object result = BeanUtils.getPropertyValue(bean, fieldName);
return result == null ? null : result.equals(value);
}
}
).next();
}
何か案が?