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") ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- 是否有一个ImmutableBitSet n Java?
- java – 你是否在Spring和Hibernate Web应用程序
- java – 为什么在实现Runnable时使用Thread.curr
- java – 为什么在类中声明变量私有?
- Jedis出现connection timeout问题解决方法(Jedi
- java – Project Euler(P14):递归问题
- Java反射:在自定义AbstractProcessor中查找方法
- java – 如何基于用户数据的一些哈希生成自定义
- java – Hibernate:saveorupdate()没有更新对象
- 浅谈Java多线程处理中Future的妙用(附源码)
热点阅读