通用接口错误

时间:2017-06-11 18:14:58

标签: java interface

运行以下代码:

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()

这个错误有解决方法吗?或者实现目标的替代实现?

2 个答案:

答案 0 :(得分:3)

final Class<? extends  FirebaseObject> cls,
final Callback<? extends FirebaseObject> callback

如果这两个参数具有单独的? extends约束,则它们可以引用两个不同的子类。如果您有两个子类class A extends FirebaseObjectclass 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不兼容。例如,如果callbackCallback<FirebaseObjectA>o是{ {1}},然后事情会在运行时爆炸。

您应该考虑在方法中添加一个类型参数,如下所示:

FirebaseObjectB