相同类型的Java泛型约束
我有以下问题。我的泛型类CursorPointer将游标传递到SQL数据库,在该数据库中,它提供了几种方法来提取当前游标位置的值。现在我想提供一个接口,可以重新查询相同类型的游标 当前我的代码如下所示:相同类型的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
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(“未选中”)添加到覆盖的方法中。