扩展 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&lt;T extends Q&gt; extends ParseRecyclerQueryAdapter&lt;T, QAdapter.MyViewHolder&gt; ... ,但这引入了另一个错误,即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】:

好吧,正如那句老话所说,“确保一切都是连续的”或类似的东西。你有一个抽象的好主意并且你做对了,但也许你刚刚遇到了继承问题,因为没有由处理器遇到的相同参数发出相同的调用。比如&lt;? extends Q,...&gt; 所以在这种情况下你必须确保它都是多余的。祝你好运!

【讨论】:

【参考方案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 并拥有通用查询工厂的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

ParseObject 中解析查询的问题

在用户类中查询 ParseObject(Pointer)

Parse.com如何对包含的ParseObject进行排序和查询?

Android - 解析查询.include(“key”)不返回完整的ParseObject详细信息

创建具有多个链接服务的通用数据工厂

Typescript 通用消息工厂