2014-06-10 2 views
2

다음과 같은 문제가 있습니다. 제네릭 클래스 CursorPointer는 현재 커서 위치의 값을 추출하는 여러 가지 방법을 제공하는 SQL 데이터베이스에 커서를 전달합니다. 이제 같은 유형의 커서를 다시 쿼리 할 수있는 인터페이스를 제공하려고합니다. 동일한 유형의 Java 제네릭 제약

현재 내 코드는 다음과 같습니다도

public class RouteCursor extends CursorPointer<RouteElement> { 

    @Override 
    public CursorPointer<RouteElement> reQuery() { 
     // TODO Auto-generated method stub 
     return super.reQuery(); 
    } 
} 

그래서 다시 쿼리 - 메서드의 반환 형식이 제네릭 :

public abstract class CursorPointer<TElement> { 

    public static interface ICursorQuery<TElement> { 
     public CursorPointer<TElement> query(); 
    } 

    private final ICursorQuery<TElement> reQueryHandler; 
    private final Cursor cursor; 

    public CursorPointer(Cursor cursor, ICursorQuery<TElement> reQueryHandler) { 
     this.cursor = cursor; 
     this.reQueryHandler = reQueryHandler; 
    } 

    public Cursor getCursor() { 
     return cursor; 
    } 

    public CursorPointer<TElement> reQuery() { 

     try { 
      return reQueryHandler == null ? null : reQueryHandler.query(); 
     } finally { 
      this.close(); 
     } 
    } 

    public TElement get(int position) { 
     cursor.moveToPosition(position); 
     return get(); 
    } 

    public TElement get() { 
     return get(cursor); 
    } 

    protected abstract TElement get(Cursor cursor); 
} 

가 커서의 구현이이 같은 발생합니다 . 하지만 실제로 CursorPointer 클래스에 대한 일반 제약이 있으므로 reQuery의 반환 형식은 RouteCursor 여야합니다.

하지만 어떻게 그 제약 조건을 정의 할 수 있습니까? CursorPointer에서

:

public <U extends CursorPointer<TElement>> U reQuery() { 

    try { 
     return (U) reQueryHandler == null ? null : reQueryHandler.query(); 
    } finally { 
     this.close(); 
    } 
} 

RouteCursor에서 :

public RouteCursor reQuery() { 
    return super.reQuery(); 
} 
+1

부모 클래스/인터페이스는 자식 클래스/인터페이스를 반환하지해야 –

+1

'CursorPointer' 클래스에서 두 번째 일반 매개 변수를 정의하는 것은 어떻습니까? CursorPointer>'를 확장합니까? 그것은 약간 즐겁다. –

+2

더 나은 점은'reQuery()'함수가'>'그렇게해야합니까? –

답변

0

이에게 기회를주십시오.
+0

'ICursorQuery # query'가'CursorPointer '를 반환하기 때문에 이것은 작동하지 않습니다. 이 디자인을 변경하더라도 작동하지 않습니다. –

+0

@LuiggiMendoza - 사실이 아닙니다. 'query()'는 추상 클래스의 리턴 타입을 가지며 그 클래스의 객체를 생성 할 수 없습니다. 이와 같이'query()'가 **를 반환하면 **는 'U'에 대한 기준과 일치하거나 null이됩니다. –

+0

@Rudi 예, 그렇지만 반환 된 객체에서 어떤 메소드를 호출 할 수 있습니까? –

관련 문제