【问题标题】:Java generics constraint for same type相同类型的 Java 泛型约束
【发布时间】:2014-06-10 15:04:20
【问题描述】:

我遇到了以下问题。我的泛型类 CursorPointer 向 SQL 数据库提供了一个游标,它提供了几种方法来提取当前游标位置的值。现在我想提供一个能够重新查询相同类型游标的接口。

目前我的代码如下所示:

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。

但是如何定义那个约束呢?

【问题讨论】:

  • 父类/接口不应返回子类/接口。
  • &lt;? extends CursorPointer&gt;CursorPointer 类上定义第二个泛型参数怎么样?有点恶心。
  • 或者更好的是,让reQuery() 函数返回&lt;? extends CursorPointer&lt;RouteElement&gt;&gt; 应该可以,不是吗?
  • 当我重写具有约束 extends ...> 并将其返回类型更改为真实的类型(让我们说“RouteCursor”),然后我会收到警告,然后我需要取消该警告。
  • @Rudi 这不是作弊。贴吧。

标签: java sql generics jdbc constraints


【解决方案1】:

试一试:

在光标指针中:

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

【讨论】:

  • 这不起作用,因为ICursorQuery#query 返回CursorPointer&lt;TElement&gt;。即使改变这个设计,也行不通。
  • @LuiggiMendoza - 这不是真的。 query() 具有抽象类的返回类型,您不能创建该类的对象。因此,query() 返回的任何内容匹配U 的条件,或者为空。
  • @Rudi 是的,但是您可以从返回的对象调用哪些方法?
  • 那你还需要在被覆盖的方法中添加@SuppressWarnings("unchecked")。
猜你喜欢
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
相关资源
最近更新 更多