【问题标题】:How to make generic type 2d arrays in Java如何在 Java 中制作泛型二维数组
【发布时间】:2019-02-07 17:11:23
【问题描述】:

我正在尝试使用 Cuckoo Hash 方法创建一个哈希函数。当我想将表存储在二维数组中时,问题就来了,每一列代表一种类型的哈希函数,它是索引。当我试图使它更通用时,我也遇到了使表本身成为通用类型的问题。但是,我找不到任何可以让我这样做的东西。

我尝试使用这里提到的方法:How to create a generic array in Java? 但由于我缺乏知识,我无法通过创建一个新类来让它工作。我也尝试过使用 Object 数组,它一直有效,直到我需要从中获取数据,它只是拒绝让我将它转换为 Node,除非我将它包装在一个函数中。这种方式变得混乱且充满潜在的错误

class CuckooHash<Key, Node> {
    class Node{ // Node of a hash to store  key and value
        Key key ;
        Value value ;
    }
    int capacity ;
    Node[][] table = (Node[][]) Array.instanceOf(new Class<Node[]>, capacity ) ; // I tried to mimic C  dynamic array base on what I was able to grapsh
    table = (Node []) Array.instanceOf(new Class<Node>, capacity) ;

基本上,我希望 table 成为具有通用类型的二维数组,并以一种全面、最简洁的方式进行。附带说明一下,我确实知道 ArrayList 是可用的,但出于我的目的,这就是我所坚持的

【问题讨论】:

    标签: java hash computer-science


    【解决方案1】:

    不要重复使用名称;现在,您的泛型参数和内部类都称为“节点”。其次,坚持 java 习惯用法:泛型参数应该是一个大写字母。试试“N”。

    您不能制作参数数组。通常,您只需使用“对象”(这是 ArrayList 所做的)。

    您链接到的技巧是调用者传递了一个表示节点类型的类引用,但您没有将其添加为参数,通常您不想这样做。例如,这意味着尝试将List&lt;String&gt; 作为节点是不可能的。

    我 99% 确定您只需要 Object[][] 在这里。在任何必要的地方强制转换为 (T) 并且不要通过(公共)访问器授予对该字段的访问权限,并且您仍然具有类型安全性。

    【讨论】:

    • 你能建议如何转换它,这样我就不必编写包装函数了。我尝试了(类型),但无论出于何种原因它都不起作用。我想我在这里遗漏了一些东西,但我让它工作的唯一方法是通过一个返回 Node 类型的 Object 的函数,我也是新的并且在 Java 中没有经验,因此我讨厌一个类,我会尝试改进你的建议
    • 公共类 MyArrayList { Object[] elems; public E get(int idx) {return (E) elems[i];这可以正常工作,但您必须在 get 方法上禁止不安全的强制转换警告。
    • 我希望有一种方法,我根本不需要使用函数
    猜你喜欢
    • 2015-07-12
    • 2012-01-06
    • 2011-08-02
    • 2013-06-22
    • 2014-12-05
    • 2018-04-03
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多