2014-06-10 52 views
2

我遇到了以下問題。我的泛型類CursorPointer將一個遊標傳遞給SQL數據庫,在該數據庫中提供了幾種方法來提取當前遊標位置的值。現在我想提供一個能夠重新查詢相同類型遊標的界面。同一類型的Java泛型約束條件

目前我的代碼看起來是這樣的:

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

該遊標的實現會導致這樣的事情:

public class RouteCursor extends CursorPointer<RouteElement> { 

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

所以重新查詢,方法的返回類型是通用的,太。但我實際上想要在CursorPointer類上使用泛型約束,以便reQuery的返回類型必須是RouteCursor。

但如何定義該約束?

+1

父類/接口應該不會返回一個子類/接口。 –

+1

如何在''CursorPointer'類中定義第二個泛型參數?擴展CursorPointer>'?這有點不好意思。 –

+2

或者更好的辦法是讓'reQuery()'函數返回'<?擴展CursorPointer >'這應該做,不是嗎? –

回答

0

這給一個鏡頭:

在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(); 
} 
+0

這不起作用,因爲'ICursorQuery#query'返回'CursorPointer '。即使改變這種設計,也不行。 –

+0

@LuiggiMendoza - 事實並非如此。 'query()'具有抽象類的返回類型,並且不能創建該類的對象。正如無論'query()'返回**將**匹配'U'的條件,或者爲空。 –

+0

@Rudi是的,但那麼你可以從返回的對象中調用哪些方法? –