扩展 ParseObject 并拥有通用查询工厂的正确方法
Posted
技术标签:
【中文标题】扩展 ParseObject 并拥有通用查询工厂的正确方法【英文标题】:Proper way to extend ParseObject and have a generic query factory 【发布时间】:2015-11-26 05:44:13 【问题描述】:我需要一种方法来根据用户的选择来查询不同的解析类。我按如下方式解决了这个问题。请告知如何解决我遇到的问题或建议替代/更好的方法。
我有对应于 Parse 类的类 A, B, C, ...
。它们非常相似。所以,我创建了抽象类Q
:
public abstract class Q extends ParseObject
// some shared methods
public abstract ParseQuery<? extends Q> getQuery();
每个A, B, C, ...
定义为:
@ParseClassName("A")
public class A extends Q
private static final A INSTANCE = new A();
@Override
public ParseQuery<A> getQuery()
return ParseQuery.getQuery(A.class);
public static A getInstance()
return INSTANCE;
比我的回收视图有以下回收适配器:
public class QAdapter extends ParseRecyclerQueryAdapter<Q,QAdapter.MyViewHolder> ...
我遇到的错误发生在我的活动中的以下行:
mRecyclerAdapter = new QAdapter(this, factory, true);
错误信息是:
Error:(58, 70) error: incompatible types: QueryFactory<CAP#1> cannot be converted to QueryFactory<Q>
where CAP#1 is a fresh type-variable:
CAP#1 extends Q from capture of ? extends Q
我试图将适配器类的定义通用为public class QAdapter<T extends Q> extends ParseRecyclerQueryAdapter<T, QAdapter.MyViewHolder> ...
,但这引入了另一个错误,即QAdapter 没有实现onBindViewHolder
,即使它已实现。
【问题讨论】:
您从哪个班级拨打mRecyclerAdapter = new QAdapter(this, factory, true);
? factory
是什么类型的?
【参考方案1】:
这可能行不通,但我会尝试替换
public class QAdapter extends ParseRecyclerQueryAdapter<Q,QAdapter.MyViewHolder> ...
与
public class QAdapter extends ParseRecyclerQueryAdapter<? extends Q,QAdapter.MyViewHolder> ...
【讨论】:
【参考方案2】:尝试替换
extends ParseRecyclerQueryAdapter<T, QAdapter.MyViewHolder> ...
与
extends ParseRecyclerQueryAdapter<T extends ParseObject, QAdapter.MyViewHolder> ...
这是让我的 ParseRecyclerQueryAdapter 工作的方法
【讨论】:
【参考方案3】:好吧,正如那句老话所说,“确保一切都是连续的”或类似的东西。你有一个抽象的好主意并且你做对了,但也许你刚刚遇到了继承问题,因为没有由处理器遇到的相同参数发出相同的调用。比如<? extends Q,...>
所以在这种情况下你必须确保它都是多余的。祝你好运!
【讨论】:
【参考方案4】:你应该让你的基类 Q 通用:
public abstract class Q<T extends Q<T>> extends ParseObject
// some shared methods
public abstract ParseQuery<T> getQuery();
那么你的A类就变成了
@ParseClassName("A")
public class A extends Q<A>
private static final A INSTANCE = new A();
@Override
public ParseQuery<A> getQuery()
return ParseQuery.getQuery(A.class);
public static A getInstance()
return INSTANCE;
ParseQuery 是:
public class ParseQuery<T>
public static <T> ParseQuery<T> getQuery(Class<T> clazz)
return null;
【讨论】:
以上是关于扩展 ParseObject 并拥有通用查询工厂的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
Parse.com如何对包含的ParseObject进行排序和查询?