2013-01-14 4 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 메서드를 재정의하면 제대로 작동하지만 왜 이런 일이 발생하는지 알 수 없습니다.

오버라이드에 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 Generics 유형 삭제시 문제가 발생했습니다. Predicate와 같은 매개 변수가있는 조건자를 만들 때 사용하는 API (클래스 Predicate 포함)에 문제가 있습니다. 다행히도 인수로 일치시킬 구체적인 클래스를받는 생성자를 제공합니다. 그것은 우아하지 않지만 작동합니다.

코드는 다음과 같이이다 : A의

방법에 uniqueResult : 마지막으로 D에

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(); 

:

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

감사합니다!

1

동작은 제네릭의 영향을받을 수 없습니다. 그것은 컴파일 타임 기능이고 제네릭 정보는 (효과적으로) 컴파일 후 손실됩니다. 문제는 다른 곳에서 발생합니다.

Btw 그냥 술어 (Predicate) getFilter()를 도입하지 말고 그냥 무시하십시오. 더 읽기 쉬울 것입니다.

관련 문제