使用参数化类型,我的行为很奇怪。
我有一个扩展类B的类A。A有一个内部类A1,它扩展了类Predicate。
代码如下:
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);
}
}
问题是match方法(在A1内)接收到BigDecimal而不是MyVO。
如果我在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();
}
任何的想法?
最佳答案
行为完全不受泛型影响。它是编译时功能,泛型信息在编译后会(有效)丢失。所以问题出在其他地方,IMO。
顺便说一句,为什么不只引入谓词getFilter()并覆盖它呢?会更具可读性。
关于java - 参数化类问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14324276/