使用参数化类型,我的行为很奇怪。
我有一个扩展类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/

10-10 08:50
查看更多