繁体   English   中英

在Java中传递通配符通用数据类型的通用

[英]Pass generic of wildcard generic data type in 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>> incompatible types: <anonimous Listener<Data<? extends Model>>> cannot be converted to Listener<Data<CAP#1>>

我也尝试用this但同样的错误实现接口。

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

它不起作用的原因是因为编译器不知道两个通配符( ? 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);

Shmosel有一个很好的解决方案。 我只想补充一点,如果您有Java 8,则可以使用可以推断正确类型的lambda,这与匿名类相反:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM