扩展ParseObject并拥有通用查询工厂的正确方法

时间:2015-11-26 05:44:13

标签: java android generics parse-platform

我需要一种基于用户做出的选择来查询不同解析类的方法。我解决了这个问题如下。请告知如何解决我的问题或建议替代/更好的方法。

我有类A, B, C, ...,对应于Parse类。它们非常相似。所以,我创建了抽象类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也没有实现。{/ p>

4 个答案:

答案 0 :(得分:0)

这可能不起作用,但我会尝试更换

public class QAdapter extends ParseRecyclerQueryAdapter<Q,QAdapter.MyViewHolder>{ ... }

public class QAdapter extends ParseRecyclerQueryAdapter<? extends Q,QAdapter.MyViewHolder>{ ... }

答案 1 :(得分:0)

尝试替换

extends ParseRecyclerQueryAdapter<T, QAdapter.MyViewHolder> {... }

extends ParseRecyclerQueryAdapter<T extends ParseObject, QAdapter.MyViewHolder> {... }

这是如何让我的ParseRecyclerQueryAdapter工作

答案 2 :(得分:0)

好吧,正如那句老话,“确保一切都是连续的”或类似的东西。你对抽象有一个很好的想法并且你做得对,但也许你只是因为没有处理器遇到的相同参数发出的相同调用而得到了继承问题。比如<? extends Q,...>那么在那种情况下你必须确保它是多余的。祝你好运!

答案 3 :(得分:0)

你应该使你的基类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;
    }
}