java中通用数组的变通方法

java中通用数组的变通方法,java,generics,Java,Generics,我有一个作业,我需要制作自己的(简单的)通用链表: public class Node<T> { private int key; private T data; private Node<T> nextNode; } 公共类节点{ 私钥; 私有T数据; 私有节点nextNode; } 但是我需要实现一个带有哈希表的字典。我想制作一个包含节点的列表。在发生冲突的情况下(两个类型的对象分散到同一个节点,我只是将它们链接到链接列表) 我必须自己实施,

我有一个作业,我需要制作自己的(简单的)通用链表:

public class Node<T> {

   private int key;
   private T data;
   private Node<T> nextNode;

}
公共类节点{
私钥;
私有T数据;
私有节点nextNode;
}
但是我需要实现一个带有哈希表的字典。我想制作一个包含节点的列表。在发生冲突的情况下(两个类型的对象分散到同一个节点,我只是将它们链接到链接列表)

我必须自己实施,没有外部帮助(已经实施的列表或其他任何东西)

我是如何做到这一点的:

public class GenericDictionary<T> implements GenericDictionary_interface<T> {

    private int capacity;   
    private Node<T> [] slots;

    public GenericDictionary () {   
        this.capacity = 31;
        slots = new Node<T>[capacity];  // the array I need which I disperse to
    }
}
公共类GenericDictionary实现GenericDictionary\u接口{
私人int能力;
专用节点[]个时隙;
公共通用字典(){
这个容量=31;
slots=new Node[capacity];//我需要分散到的数组
}
}
然而,这并不完全可能。我确实试着阅读了这个主题,试着在这里搜索,所以。。。但我一点也不明白


我唯一的要求是。。。不要懒惰于变量/方法名称,请让它们易于理解。

以下是您能做的最好的事情:

    @SuppressWarnings("unchecked")
    Node<T>[] slots = (Node<T>[]) new Node<?>[capacity];
@SuppressWarnings(“未选中”)
节点[]插槽=(节点[])新节点[容量];

你无法摆脱警告(除了抑制它)。当您需要泛型类的数组时,您需要创建具有未指定泛型类型的数组,然后将其强制转换。

所以我将节点类型转换为节点?这样就行了?好吧,有可能适得其反吗?没有。您需要了解,与生成实际实现的C++/C#模板不同,Java泛型只是额外的语法编译时检查和自动插入的强制转换。例如
ArrayList
ArrayList
是同一个类,甚至是同一个对象。泛型类型仅更改在get()上重新执行元素之前使用的强制转换,在这两种情况下都使用对象数组。另一个帮助您理解Java泛型本质的示例:您可以用10个字符串和1个整数填充列表,将其强制转换为List,只要您不尝试获取()整数元素,列表就会工作(因为get()方法的代码如下
return(T)obj_array[idx];
,当实际元素为整数时,这将导致列表中的类强制转换异常。这称为“类型擦除”:好的,我明白。我确实有C/C++的背景,所以我不太明白它是如何工作的,谢谢。@n技术员。如果你必须自己实现这个,没有外部帮助,为什么要问?这不是请求外部帮助吗?@TheBlastOne。通常,如果OP已经尝试了代码,获得一些帮助没有什么错。他作为凯德必须为他写代码。那是错误的。@RohitJain同意。我只是想知道OP是否理解他违反了规则。当然我们对此没有问题。但他应该。我认为他应该质疑规则,因为从外部获得(并接受)暗示或帮助,并接受它,是学习的关键。@Kalec我所说的是a)不要只是违反规则,破坏它!因为b)我同意当你请求正确的帮助时,你没有做错什么。