当前位置: 首页 > 面试题库 >

如何用Java实例化一组地图?

薛欣荣
2023-03-14
问题内容

我可以使用泛型声明地图数组以指定地图类型:

private Map<String, Integer>[] myMaps;

但是,我不知道如何正确实例化它:

myMaps = new HashMap<String, Integer>[count]; // gives "generic array creation" error
myMaps = new HashMap[count]; // gives an "unchecked or unsafe operation" warning
myMaps = (Map<String, Integer>[])new HashMap[count]; // also gives warning

如何在不出现编译器错误或警告的情况下实例化此映射数组?

更新:

谢谢大家的回复。我最终接受了List建议。


问题答案:

您不能安全地创建通用数组。有效的Java 2nd Edition在“
泛型 ”
一章中进行了详细介绍。从第119页的最后一段开始:

为什么创建通用数组是非法的?因为它不是类型安全的。如果合法,则编译器在其他正确程序中生成的强制转换在运行时可能会失败,并带有
ClassCastException。这将违反通用类型html" target="_blank">系统提供的基本保证。

为了更具体,请考虑以下代码片段:

// Why generic array creation is illegal - won't compile!
List<String>[] stringLists = new List<String>[1]; // (1)
List<Integer> intList = Arrays.asList(42); // (2)
Object[] objects = stringLists; // (3)
objects[0] = intList; // (4)
String s = stringLists[0].get(0); // (5)

让我们假装创建通用数组的第一行是合法的。第2行创建并初始化一个
List<Integer>包含单个元素的。第3行将List<String>数组存储 到Object
数组变量中,这是合法的,因为数组是协变的。第4行将int存储List<Integer>Object数组的唯一元素中,这是成功的,因为泛型是通过擦除实现的:List<Integer>实例List的运行时类型为,List<String>[]实例的运行时类型
List[],因此此赋值不会生成 ArrayStoreException。现在我们有麻烦了。我们已将List<Integer>
实例存储到声明为仅容纳的数组中List<String>
实例。在第5行中,我们从此数组的唯一列表中检索唯一元素。编译器会自动将检索到的元素强制转换为String,但它是一个Integer,因此我们ClassCastException在运行时会得到一个
。为了防止这种情况发生,第1行(创建通用数组)会产生编译时错误。

因为数组和泛型不能很好地结合(以及其他原因),所以通常最好使用Collection对象(尤其是List对象)而不是数组。



 类似资料:
  • 问题内容: 我有一串 现在我想创建一个类的对象,其中的类名是 类名 这是一样的东西 我想知道怎么做… 问题答案: “使用”将回答您的所有问题。首先使用来获取对象,然后: 如果要实例化使用检索的类,则必须首先要求它提供一个代表我想要的构造函数的对象,然后要求该对象创建一个新对象。该方法在将检索; 然后,我可以通过调用其方法来使用它: 有一种方法似乎可以满足您的要求。 不要使用它 。它将静默地将检查的

  • 我尝试实例化以下Java代码中定义的内部类: 我得到了这个例外: 我错过了什么?

  • 问题内容: 我是编程的新手,我想知道实例化对象时哪里出错了。下面是代码: 问题答案: 您的代码中没有类。您声明的是私有方法。 使用当前代码段,您需要实例化该类并利用该方法。注意,在这种情况下,您的类定义前面有关键字 class。 但这并没有实际意义,您的方法总是会返回。 您是否正在尝试执行以下操作:

  • 问题内容: 我使用,在我的应用程序中添加了易于阅读的配置文件,并试图在该文件周围添加包装器,以简化类型转换。具体来说,我希望返回的值从提供的默认值开始“继承”它的类型。到目前为止,这是我得到的: (完整示例来源。) 不管是否从属性文件中读取返回值,from的返回值都是一个布尔值,对于字符串,整数,双精度数和&c而言,返回值都类似。当然,上面的代码片段实际上并没有编译: 我做错了吗,还是我只是试图做

  • 问题内容: 当用Java实例化一个对象时,真正进入内存的是什么? 是否包含父级构造函数的副本? 投射时,为什么隐藏数据成员的行为与重写方法不同? 我理解为使您正确使用这些东西而通常给出的抽象解释,但是JVM如何真正做到这一点。 问题答案: 实例化对象时,实际上仅“静态”数据以及创建该对象的对象类型的引用被“创建”。 没有方法被复制过。 创建它的类的“引用”实际上是一个指针调度表。该类可用的每个方法

  • 我正在为Eclipse Juno编写一个插件,我想使用类AbstractSourceLookupDirector。当我查看API时,它说它有一个构造函数,但是当我在代码中使用以下语句时,它说“不能实例化类型AbstractSourceLookupDirector” AbstractSourceLookupDirector srclookupDir=新的AbstractSourceLookupDir