【问题标题】:How to create a generic return type for an abstract class override method如何为抽象类覆盖方法创建泛型返回类型
【发布时间】:2012-09-25 18:41:12
【问题描述】:

我有一个由 Java 和 Android 实现的抽象类。这个类有一个方法需要返回一个泛型 Cursor 以便实现可以返回它们各自的游标。

我的抽象类:

public abstract class DatabaseAdapter {

protected abstract com.domain.database.Cursor<?> executeQuery(String command);      

}

光标类型:

public final class Cursor<T> {

private T value = null;

public void setValue(T value) {
    this.value = value;
}

public T getValue() {
    return value;
}
    }

如前所述,我希望实现方法根据具体情况返回 Java 游标或 Android 游标。我可以很好地创建抽象类,但是当我尝试实现时,出现编译错误。我显然在这里不太了解多态性。

实现方法

public Cursor executeQuery(String query){
Cursor cursor = db.rawQuery(query, selectionArgs);
return cursor;      
}

Cursor 是 android.database.Cursor

【问题讨论】:

  • 你得到了什么编译器错误?可以发在这里吗?
  • 返回类型与DatabaseAdapter.executeQuery(String)不兼容
  • executeQuery 实现中返回类型Cursor 的完全限定名称是什么。可能这就是问题所在。
  • 您的实现应该返回这种 (com.domain.database.Cursor&lt;?&gt;) 类型的游标。您的编译器错误清楚地表明:-android.database.Cursorcom.domain.database.Cursor&lt;?&gt; 不兼容。此外,它应该是通用游标..
  • 那么,如何设置抽象类以便可以返回 android.database.cursor 或 java.awt.Cursor?正如主题所述。

标签: java android generics types


【解决方案1】:

我猜你可以删除com.domain.database.Cursor,但我可能错了。

我的解决方案是使DatabaseAdapter 通用,而不是Cursor

/**
 * @param C the type of the Cursor this adapter returns
 */
public abstract class DatabaseAdapter<C> {
    protected abstract C executeQuery(String command);      
}

然后你像这样实现:

public class AndroidDatabaseAdapter extends DatabaseAdapter<android.database.Cursor> {
    public Cursor executeQuery(String query){
        Cursor cursor = db.rawQuery(query, selectionArgs);
        return cursor;
    }
}

【讨论】:

  • 这是我丢失的链接 - 非常感谢!
猜你喜欢
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多