2013-01-14 57 views
0

我用參數化類型得到一個奇怪的行爲。 我是一個擴展類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延伸的,並使用uniqueResult方法:

public class D extends A<MyVO> { 
    public MyVO findById (BigDecimal id) { 
     return uniqueResult("id", id); 
    } 
} 

的問題是,所述匹配方法(內側A1)接收的代替MyVO BigDecimal的。 如果我重寫D中的uniqueResult方法,它工作正常,但我不明白爲什麼會發生這種情況。

的overrided 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(); 
} 

任何想法?

+0

'最後是班級,' - 班級在哪裏?它看起來像你錯過了這個問題... – Krease

+0

對不起,似乎有一部分是錯過了。 –

+0

根據你如何定義'D','uniqueResult'應該返回'MyVO'類型 - 所有其他事物(B,A1)不影響'uniqueResult'的返回類型。 – Krease

回答

0

問題出在Java泛型類型擦除。 我使用的API(包含謂詞類)在創建Predicate參數化謂詞時存在問題。幸運的是,它提供了一個構造函數,它接收要匹配的具體類作爲參數。它不是優雅的,但它的作品。

的代碼是這樣的:

的方法uniqueResult在答:

protected T uniqueResult (final String fieldName, final Object value) { 
    return container().query(
     new Predicate<T>(getPredicateClass()) { 
      private static final long serialVersionUID = 1L; 
      public boolean match(T bean) { 
       Object result = BeanUtils.getPropertyValue(bean, fieldName); 
       return result == null ? null : result.equals(value); 
      } 
     } 
    ).next(); 
} 

新增

protected abstract Class<T> getPredicateClass(); 

最後在d:

protected Class<MyVO> getPredicateClass() { 
    return MyVO.class; 
} 

商祺!

1

行爲不會受到仿製藥的影響。這是編譯時的功能,並且編譯後,仿製信息會(有效)丟失。所以問題在別的地方,國際海事組織。

順便說一句,爲什麼你不介紹只是謂語getFilter()和重寫覆蓋就是這樣。會變得更可讀。