java – HashMap中的泛型似乎不能一直使用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – HashMap中的泛型似乎不能一直使用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1682字,纯文字阅读大概需要3分钟。
内容图文
![java – HashMap中的泛型似乎不能一直使用](/upload/InfoBanner/zyjiaocheng/803/bc4b5c25e2c345bdbe0858f892b17e49.jpg)
首先是泛型的新手.现在提问 – 在HashMap.java中我看到以下内容 –
transient Entry[] table;
which is initiated in constructor as
table = new Entry[capacity];
为什么没有使用类型参数声明?
要么
private V getForNullKey() {
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
为什么使用类型参数声明for循环中的Entry?
有一个深刻的概念或只是一个负担得起的不一致?
解决方法:
那是因为创建具体参数化类型的数组不是类型安全的,这就是为什么根本不允许这样做的原因.
如果您尝试这样的代码,您将收到编译器错误:
List<String>[] arr = new ArrayList<String>[10]; // Compiler error: Generic Array creation
问题是泛型类型是non-reifiable – 它们的类型信息在运行时不可用.同时,数组使用运行时可用的类型信息来执行ArrayStoreCheck,以查看插入到数组中的元素是否与数组的类型兼容.因此,如果混淆数组和泛型,那么最终可能会在运行时出现令人惊讶的行为.
例如,请考虑以下代码:
List<String>[] arr = new ArrayList<String>[10]; // Suppose this was valid
Object[] objArr = arr; // This is valid assignment. A `List[]` is an `Object[]`
objArr[0] = new ArrayList<Integer>(); // There you go. A disaster waiting at runtime.
String str = arr[0].get(0); // Assigned an `Integer` to a `String`. ClassCastException
因此,如果编译了第一个赋值,那么编译器看起来很好的第4个赋值将在运行时抛出ClassCastException.
但是,您可以创建一个原始类型数组 – ArrayList或无界通配符参数化类型 – ArrayList<?>,因为它们都是完全可再生类型.所以以下数组创建是有效的:
List[] arr = new ArrayList[10];
List<?>[] arr2 = new ArrayList<?>[10];
由于没有与原始类型或无界通配符类型相关联的类型信息,因此在运行时不会丢失任何内容.因此这些类型是可以恢复的,它们是数组的合格组件类型.这就是使用Entry []而不是Entry< K,V> []的原因.
也可以看看:
> How to create a generic array?
内容总结
以上是互联网集市为您收集整理的java – HashMap中的泛型似乎不能一直使用全部内容,希望文章能够帮你解决java – HashMap中的泛型似乎不能一直使用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。