2016-12-15 34 views
0

通配符通用数据类型的我有这个类:通通用在Java

public interface DataAccessor<E extends Model, U> 

public class Data<T> implements DataMenuItemObservable<T> { 

这个接口:

interface Listener<T> { 
    void onResponse(T value); 
} 

这个方法:

public interface DataAccessor<E extends Model, U> extends DataMenuItemObservable<E> { 

... 

    public DataAccessor<? extends Model, ?> getPrimaryDataAccessor() 

    void get(int index, Context context, Listener<Data<E>> listener, ErrorListener errorListener); 

... 

} 

,并获得此编译器错误代码:

DataAccessor<? extends Model, ?> accessor = db.getPrimaryDataAccessor(); 
accessor.get(0, this, new DataAccessor.Listener<Data<? extends Model>>() { 
      @Override 
      public void onResponse(Data<? extends Model> value) { 
      } 
     }, this); 

想法说incompatible types: <anonimous Listener<Data<? extends Model>>> cannot be converted to Listener<Data<CAP#1>>

我也试图与this但同样的错误实现接口。

如何解决错误? 是否有一些可接受的解决方法?

+0

什么的'DataAccessor.get()'签名? – shmosel

+0

什么是数据? – shmosel

+0

@shmosel更新 – nikartix

回答

3

它不起作用的原因是因为编译器不知道两个通配符(? extends Model)是否实际引用相同的类型。您可以解决此通过创建一个辅助方法来捕获类型:

private <E extends Model> void get(DataAccessor<E, ?> accessor); 
    accessor.get(0, this, new DataAccessor.Listener<Data<E>>() { 
     @Override 
     public void onResponse(Data<E> value) { 
      //... 
     } 
    }, this); 
} 

现在所说的帮手:

DataAccessor<? extends Model, ?> accessor = db.getPrimaryDataAccessor(); 
get(accessor); 
+0

谢谢!它的工作原理 – nikartix

2

Shmosel有一个很好的解决方案。我只想补充一点,如果你有Java的8,你可以使用lambda可以推断出正确的类型,违背了一个匿名类:

DataAccessor<? extends Model, ?> accessor = db.getPrimaryDataAccessor(); 
accessor.get(0, this, value -> { 
     // code 
    }, this); 
+0

我没有意识到这一点。非常好。 – shmosel