[英]Proper way to extend ParseObject and have a generic query factory
我需要一種方法來根據用戶的選擇查詢不同的解析類。 我解決了這個問題如下。 請告知如何解決我的問題或建議替代/更好的方法。
我有類, A, B, C, ...
對應於Parse類。 它們非常相似。 所以,我創建了抽象類Q
:
public abstract class Q extends ParseObject {
// some shared methods
public abstract ParseQuery<? extends Q> getQuery();
}
A, B, C, ...
每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
即使它是實現。
這可能不起作用,但我會嘗試更換
public class QAdapter extends ParseRecyclerQueryAdapter<Q,QAdapter.MyViewHolder>{ ... }
同
public class QAdapter extends ParseRecyclerQueryAdapter<? extends Q,QAdapter.MyViewHolder>{ ... }
嘗試更換
extends ParseRecyclerQueryAdapter<T, QAdapter.MyViewHolder> {... }
同
extends ParseRecyclerQueryAdapter<T extends ParseObject, QAdapter.MyViewHolder> {... }
這是如何使我的ParseRecyclerQueryAdapter工作
好吧,正如那句老話,“確保一切都是連續的”或類似的東西。 你對抽象有一個很好的想法並且你做得對,但也許你只是因為沒有處理器遇到的相同參數發出的相同調用而得到了繼承問題。 喜歡<? extends Q,...>
<? extends Q,...>
所以在這種情況下,你必須確保它是多余的。 祝好運!
您應該使您的基類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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.