Java泛型和Serializable
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java泛型和Serializable,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2565字,纯文字阅读大概需要4分钟。
内容图文
![Java泛型和Serializable](/upload/InfoBanner/zyjiaocheng/824/58dab628183e491c8a96882916bc7a06.jpg)
我们创建了一个抽象类,用于处理Redis(set / get values),如下所示:
public abstract class AbstractCachedSupport<T extends Serializable> {
protected T get(CacheKey key, Supplier<T> supplier) {...}
// ...
}
我不高兴的是,在扩展这个类时我们不能使用List,Map等接口:
public class CachedMap extends AbstractCachedSupport<Map<String, Integer>>
因为它们不扩展Serializable,所以我们必须始终使用具体的类:
public class CachedMap extends AbstractCachedSupport<HashMap<String, Integer>>
毋庸置疑,当从一个具体类迁移到另一个具体类时,这有其共同的问题.这也不是我称之为最佳实践的东西,但也许这只是我.
使我们能够灵活地使用接口的替代方法是删除有界类型并在运行时检查T是否扩展Serializable:
public abstract class AbstractCachedSupport<T> {
public AbstractCachedSupport() {
final Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
if (!Serializable.class.isAssignableFrom(type)) {
throw new RuntimeException("T must extend Serializable");
}
}
protected T get(CacheKey key, Supplier<T> supplier) {...}
// ...
}
这使我们没有编译时间检查T扩展Serializable,也不是一件好事.
你知道我们如何能够优雅地解决这个问题吗?您是想使用第一个(有界类型参数)还是第二个(仅运行时检查)?
折衷方案是选择第一个并始终使用容器类来保存集合:
public class IntegerParamsContainer implements Serializable {
private static final long serialVersionUID = 1L;
private Map<String, Integer> map;
}
public class CachedMap extends AbstractCachedSupport<IntegerParamsContainer>
但这最终与第二个问题相同:没有编译时间检查,开发人员肩负着始终使用实现Serializable的集合的责任.
编辑:
扩展AbstractCachedSupport的一些类是Spring(当前版本为4.1)组件类,它们不称为CachedMap或类似的东西,而是CityAutocompleteDataBean,WrParamsDataBean等.
如果我们将泛型添加到这些组件类中,我们最终会得到如下声明:
@Inject
private CityAutocompleteDataBean<ArrayList<String>>;
@Inject
private WrParamsDataBean<HashMap<String, WrData>>;
而不是
@Inject
private CityAutocompleteDataBean;
@Inject
private WrParamsDataBean;
使用< ArrayList< String>>的原因和< HashMap< String,WrData>>当他们看到这样的代码行时,他们将逃避大多数开发人员.考虑到我们的起点以及我们使用它的原因,我也觉得它很难看.
尽管如此,这符合我的要求,谢谢Jesper.
解决方法:
您可以使用以下语法执行此操作:
public abstract class AbstractCachedSupport<T extends Serializable> {
// ...
}
public class CachedMap<T extends Map<String, Integer> & Serializable>
extends AbstractCachedSupport<T> {
// ...
}
这意味着类型T必须实现Map< String,Integer>还有Seri??alizable.
然后,您可以将CachedMap与实现Serializable的特定Map实现一起使用:
CachedMap<HashMap<String, Integer>> cachedMap = new CachedMap<>();
内容总结
以上是互联网集市为您收集整理的Java泛型和Serializable全部内容,希望文章能够帮你解决Java泛型和Serializable所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。