运行以下代码:
public static void get(FirebaseObject o, final Class<? extends FirebaseObject> cls, final
Callback<? extends FirebaseObject> callback) {
FirebaseDatabase.getInstance().getReference().child(o.getPath())
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
FirebaseObject o = dataSnapshot.getValue(cls);
o.setKey(dataSnapshot.getKey());
cls.cast(o);
callback.onSuccess(cls.cast(o));
}
@Override
public void onCancelled(DatabaseError databaseError) {
callback.onError(databaseError);
}
});
}
public interface Callback<F extends FirebaseObject> {
void onSuccess(F firebaseObject);
void onError(DatabaseError error);
}
我在callback.onSuccess(cls.cast(o));
收到错误:
`onSuccess <capture ? extends FirebaseObject> in Callback cannot be applied to <capture ? extends FirebaseObject>`
基本上我在设置密钥后尝试传递Class<? extends FirebaseObject> cls
中提供的onSuccess()
。
这个错误有解决方法吗?或者实现目标的替代实现?
答案 0 :(得分:3)
final Class<? extends FirebaseObject> cls,
final Callback<? extends FirebaseObject> callback
如果这两个参数具有单独的? extends
约束,则它们可以引用两个不同的子类。如果您有两个子类class A extends FirebaseObject
和class B extends FirebaseObject
,则参数可以是
final Class<A> cls, final Class<B> callback
如果是这种情况,那么callback.onSuccess(cls.cast(o))
将不起作用,因为cls.cast(o)
会返回A
个对象而onSuccess
会想要B
。
如果您希望这些引用同一个类,那么您需要通过为其指定名称来使其明确。
public static <T extends FirebaseObject> void get(
FirebaseObject o, final Class<T> cls, final Callback<T> callback)
答案 1 :(得分:2)
您的callback
参数可能与您传入的o
不兼容。例如,如果callback
是Callback<FirebaseObjectA>
但o
是{ {1}},然后事情会在运行时爆炸。
您应该考虑在方法中添加一个类型参数,如下所示:
FirebaseObjectB