【问题标题】:Array of generic holders通用持有人数组
【发布时间】:2016-06-12 22:58:35
【问题描述】:

如果我有一个 Entry .. objects 的映射,并且我在一个类中有一个数组

private Entry<K,V> array;

我可以说

array = new Entry[someInt];

我已经完成了,或者我需要像我的导师说的那样需要一个类型转换,例如

array = (Entry<K,V> E[]) new Entry[someInt];

请注意,当我运行 JUnit 时,第一个确实有效。

【问题讨论】:

  • 你为什么要编辑回我所做的代码格式更改?您的代码中有尖括号
  • 第一个解决方案不好,第二个有错字:array = (Entry&lt;K,V&gt;[]) new Entry[someInt];

标签: java arrays generics


【解决方案1】:

你有没有想过做一个 List ?

Entry<K,V> array = new ArrayList<Entry<K,V>>();
array.add(new HashMap<K,V>());

【讨论】:

  • 我必须使用 backingArray,但我只是想知道强制转换是否真的有必要
  • 哦,明白了。当使用 Java 集合框架类 java 例如ArrayList、LinkedList 或 HashSet 等。它们接受 java.lang.Object 类型的对象,允许将任何对象插入到集合中。当我们从集合中检索 Object 时,它们是 java.lang.Object 类型,需要对其进行强制转换以执行操作。我面前没有你的全部代码,所以我不能告诉你我们是否可以在没有获得 Class Cast Exception 的情况下进行声明。
  • 我们基本上是在实现自己的hashMap。第一种方法没有给我任何例外并且运行良好,但我的教授说这是一个问题。
  • array = new Entry[someInt],只会创建一个类对象的数组。您基本上是在创建一个具有两个泛型的类,并且泛型有限制。现在这可能是一个问题,也可能不是取决于其余代码的编写方式。如果您的教授想要,我会添加类型转换,您可以问他为什么他特别要求它。
【解决方案2】:

你可以做任何一个。允许在不进行强制转换的情况下与原始类型进行隐式转换。

array = new Entry[someInt]; 将产生未经检查的转换警告。

array = (Entry&lt;K,V&gt;[])new Entry[someInt]; 将产生未经检查的强制转换警告。

所以没有一个真的比另一个更好。

请注意,如果您使用通配符类型创建数组,则需要进行强制转换:

array = (Entry<K,V>[])new Entry<?,?>[someInt]; // compiles
array = new Entry<?,?>[someInt];               // doesn't compile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多