Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashMap实现中的泛型_Java_Generics_Hashmap - Fatal编程技术网

Java HashMap实现中的泛型

Java HashMap实现中的泛型,java,generics,hashmap,Java,Generics,Hashmap,在Java实现中,我发现 transient Entry[] table; which is initiated in constructor as table = new Entry[capacity]; 我知道并理解创建泛型数组是不允许的,但我没有理解的是整个过程是如何工作的。我是说当我们做类似的事情时 HashMap<Integer, String> hMap = new HashMap<Integer, String>(); HashMap<In

在Java实现中,我发现

 transient Entry[] table; 
 which is initiated in constructor as
 table = new Entry[capacity];
我知道并理解创建泛型数组是不允许的,但我没有理解的是整个过程是如何工作的。我是说当我们做类似的事情时

HashMap<Integer, String> hMap = new HashMap<Integer, String>();
HashMap<Integer, String> hMap = new HashMap<Integer, String>();
上述代码如何导致创建类型为的条目数组

嗯,很少有人不理解我的要求。换句话来说,我所问的是,做这样的事情有什么意义

HashMap<Integer, String> hMap = new HashMap<Integer, String>();
HashMap<Integer, String> hMap = new HashMap<Integer, String>();
当它不会导致

Entry<Integer, String>

泛型是编译时安全的。在运行时,贴图只知道对象。这就是所谓的类型擦除。为了让您更加害怕,以下代码将毫无问题地运行:

Map<Integer, Integer> safeMap = new HashMap<>();
Map unsafeMap = safeMap;
unsafeMap.put("hello", "world");

您将在编译时收到警告,因为您使用的是原始映射而不是通用映射,但在运行时,根本不进行任何检查,因为映射是一个能够存储任何对象的好的旧映射。只有编译器才能阻止您在映射或整数中添加字符串。

实现生成类型为的条目对象数组

static class Entry<K,V> implements Map.Entry<K,V>
不提供泛型类型参数。这是允许的,但要理解编译器不再保证类型安全。例如,在代码的其他地方,您可以编写

Entry<K,V> e = table[bucketIndex];
编译器会让你这么做。如果您确定总是将表[]的元素设置为null或Entry,那么您就知道赋值是正确的


这样做没有问题的原因是Java中的泛型类型是通过类型擦除实现的,也就是说,条目对象条目和条目在运行时没有区别。

试着这样看待Java泛型:类型参数只适用于引用类型表达式的静态类型,而不适用于运行时引用值引用的实际实例的类型

我发现上面提到的在阅读Java代码时培养正确直觉的关键。所以下次你看到

new HashMap<Integer, String>()
如下所示:这是HashMap类型的实例创建表达式。在运行时,此表达式将生成对HashMap类实例的引用。只要编译器能够精确地跟踪您对该表达式的结果所做的操作,它就可以保持这确实是一个HashMap的知识,但仅此而已


现在,由于静态类型系统的功能不足以跟踪数组的组件类型上的类型参数,Java的数组类型是协变的这一事实在这里发挥了重要作用,因此代码被迫脱离静态类型安全网络。关键的观察是,就其本身而言,这并不会使代码不正确,它只会限制编译器查找编程错误的能力。这就是为什么Java允许您将未经检查的强制转换从原始类型转换为泛型类型,尽管并非没有警告,警告标志着您已经离开了静态类型安全的省份。

不清楚您在问什么。您似乎已经准确地了解了发生的情况,它使用了一个条目原始类型数组。作为旁注,这不是本机代码,它只是JDK代码。谢谢,我将更正“本机”部分。我想问的是。。如何将此参数传递给Entry类以确保Entry@Walt关于上次编辑:因为新条目[capacity]或新条目[capacity]是无效的Java代码。它不能编译。您不能创建泛型类型的数组。请参阅此答案是否正确。如果他/她不同意,那么下一个投票人也应该下一个投票给我,但他/她应该解释原因。