Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相同类型的Java泛型约束_Java_Sql_Generics_Jdbc_Constraints - Fatal编程技术网

相同类型的Java泛型约束

相同类型的Java泛型约束,java,sql,generics,jdbc,constraints,Java,Sql,Generics,Jdbc,Constraints,我有以下问题。我的泛型类CursorPointer将游标传递到SQL数据库,在该数据库中,它提供了几种方法来提取当前游标位置的值。现在我想提供一个接口,可以重新查询相同类型的游标 当前我的代码如下所示: public abstract class CursorPointer<TElement> { public static interface ICursorQuery<TElement> { public CursorPointer<TE

我有以下问题。我的泛型类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();
    }
}
公共抽象类游标指针{
公共静态接口ICursorQuery{
公共游标指针查询();
}
私人最终ICursorQuery再查询处理程序;
私有最终游标;
公共游标指针(游标游标、ICursorQuery reQueryHandler){
this.cursor=游标;
this.reQueryHandler=reQueryHandler;
}
公共游标getCursor(){
返回光标;
}
公共光标重新查询(){
试一试{
return reQueryHandler==null?null:reQueryHandler.query();
}最后{
这个。关闭();
}
}
公共远程通信get(内部位置){
光标。移动位置(位置);
返回get();
}
公共远程通信get(){
返回get(游标);
}
受保护的抽象远程通信获取(游标);
}
该游标的实现将产生如下结果:

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();
    }
}
公共类路由器或扩展游标指针{
@凌驾
公共光标重新查询(){
//TODO自动生成的方法存根
返回super.reQuery();
}
}
因此,reQuery方法的返回类型也是泛型的。但我实际上需要对CursorPointer类进行一个泛型约束,以便reQuery的返回类型必须是RouteCursor

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

试一试:

在游标指针中:

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

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

父类/接口不应返回子类/接口。在
游标指针
类上定义第二个泛型参数如何?或者更好的做法是,当我重写具有约束@Rudi的方法时,让
重新查询()
函数返回
。只需发布它。这不起作用,因为
ICursorQuery#query
返回
CursorPointer
。即使改变这种设计,也不行。@LuiggiMendoza-那不是真的
query()
具有抽象类的返回类型,不能创建该类的对象。同样地,
query()
返回的任何内容都将与
U
的条件相匹配,或者为空。@Rudi是的,但是您可以从返回的对象调用哪些方法?然后您仍然需要将@SuppressWarnings(“未选中”)添加到覆盖的方法中。