2014-06-10 4 views
2

У меня возникла следующая проблема. Мой общий класс CursorPointer поставляет курсор в базу данных SQL, где он предоставляет несколько методов для извлечения значений для текущей позиции курсора. Теперь я хотел бы предоставить интерфейс, способный запросить курсор того же типа.Ограничение Java generics для того же типа

В настоящее время мой код выглядит следующим образом:

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

Так возвращаемый тип Requery-метод является общим, слишком , Но мне действительно нужен общий ограничитель класса CursorPointer, так что возвращаемый тип reQuery ДОЛЖЕН снова быть RouteCursor.

Но как определить это ограничение?

+1

родительский класс/интерфейс не должен возвращать дочерний класс/интерфейс. –

+1

Как определить второй общий параметр в классе 'CursorPointer'' '? Это немного смешно. –

+2

Или еще лучше, если функция 'reQuery()' return '> 'Это должно сделать это, нет? –

ответ

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 да, но тогда какие методы вы сможете вызвать из возвращаемого объекта? –

Смежные вопросы