加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 泛型,类型擦除和静态结构方法

发布时间:2020-12-15 02:15:31 所属栏目:Java 来源:网络整理
导读:例如,我有SimpleCallback类 public class SimpleCallbackT implements CallbackT { private SuccessListenerT successListener; private ErrorListener errorListener; protected SimpleCallback() { } public static C SimpleCallbackC success(SuccessList
例如,我有SimpleCallback类

public class SimpleCallback<T> implements Callback<T> {

    private SuccessListener<T> successListener;
    private ErrorListener errorListener;

    protected SimpleCallback() {

    }

    public static <C> SimpleCallback<C> success(SuccessListener<C> listener) {
        SimpleCallback<C> callback = new SimpleCallback<>();
        callback.successListener = listener;
        return callback;
    }

    public SimpleCallback<T> error(ErrorListener errorListener) {
        this.errorListener = errorListener;
        return this;
    }

    @Override
    public void onComplete(T result) {
        notifySuccess(result);
    }

    @Override
    public void onError() {
        notifyError();
    }

    public interface SuccessListener<T> {

        void onSuccess(T result);
    }

    public interface ErrorListener {

        void onError();
    }

}

现在我想使用这个回调让get cats异步:

SimpleCallback<List<Cat>> callback = SimpleCallback
            .success(cats -> cats.forEach(Cat::meow));

现在没关系,但是当我想添加错误监听器时,我的猫会成为原始对象

SimpleCallback<List<Cat>> callback = SimpleCallback
            .success(cats -> cats.forEach(Cat::meow)) <-- Here cats become objects
            .error(() -> System.out.println("Cats error"));

解决方案之一使用显式泛型类型:

SimpleCallback<List<Cat>> callback = SimpleCallback.<List<Cat>>
            .success(cats -> cats.forEach(Cat::meow))
            .error(() -> System.out.println("Cats error"));

但它看起来有点难看.那么在没有显式泛型类型的情况下创建回调的方法是什么?

UPD:我认为@Jesper提供了很好的解决方案

另一个解决方案是显式提供lambda表达式的参数类型:

.success((List<Cat> cats) -> cats.forEach(Cat::meow))

解决方法

显然,擦除泛型类型变量的策略随上下文而变化.
当然必须有规则如何运作,但我不知道他们,对不起.

从实际的角度来看,Jesper建议的解决方案,即在成功方法中给出类型信息似乎完全可以接受.

.success((List< Cat> cats) – > cats.forEach(Cat :: meow))

否则,可以在一个方法中传递两个Listeners:

public static <C> SimpleCallback<C> create(
    SuccessListener<C> successListener,ErrorListener errorListener) {
    SimpleCallback<C> callback = new SimpleCallback<>();
    callback.successListener = successListener;
    callback.errorListener = errorListener;

    return callback;
}

并在一个步骤中创建回调:

Callback<List<Cat>> callback = SimpleCallback
        .create(
            cats -> cats.forEach(Cat::meow),() -> System.out.println("Cats error")
         );

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读