【问题标题】:Understanding Java and Generic Arrays了解 Java 和泛型数组
【发布时间】:2013-11-30 09:40:54
【问题描述】:

我正在尝试执行以下代码:

public class AddressManager
{
    private ArrayList<Address>[] array;
    private int depth;

    public AddressManager(int d, int s, Address a)
    {
        array = new ArrayList<Address>[d];
    }
}

我的代码还有更多内容,但是这么多的代码足以说明我的问题。当然,netbeans 显示了一个与泛型数组有关的编译错误,在“new ArrayList ...”行上,我已经阅读了很多关于此的内容。

网络上到处都有关于编译器无法验证赋值类型的解释,如果你这样做,很多关于这个的问题都在 StackOverflow 上!据说还有一些方法可以解决这个问题,只要你向编译器展示“你知道你在做什么!”。问题是我无法让它工作,我无法理解解释,我真的想要一个数组列表。

有人可以用更简单的语言解释在我的具体情况下我可以做些什么来解决这个错误吗?我尝试了以下这种想法:

private Object[] array;
array = (ArrayList<Address>[]) new Object[d];

但它似乎无法正确转换,即使我看到的一个网站说你可以做这样的事情,或者使用“@SuppressWarnings(“unchecked”)”或其他东西。拜托,我需要的方式比与我的情况不太匹配的示例(例如 This solution)更清晰,它适用于地图,但不适用于 ArrayLists。

像我在 StackOverflow 上的问题的其他答案可能确实很有帮助,但我不太了解它们,或者我不会写这个请求以获得更实际的东西。

【问题讨论】:

  • 以下可能会有所帮助:stackoverflow.com/a/20023599/1057429
  • @amdixon 他当然可以做到——只是它不会编译... :)
  • alfasin,对您的建议采取类似的方法,我不介意“ArrayList of ArrayLists”....例如 ArrayList>....但是,假设我添加使用array.add 将一些项目添加到数组中......维持这一秩序非常重要。这是否是一个不会在我脸上抛出错误的适当解决方案?
  • 是的,这是首选方法。当然this 也可以,只是不推荐。

标签: java arrays generics arraylist


【解决方案1】:

以下没有错:

@SuppressWarnings("unchecked")
ArrayList<Address>[] array = (ArrayList<Address>[]) new ArrayList<?>[d];

您只需要确保您确实只将ArrayList&lt;Address&gt; 存储在数组中。如果您确定这一点,那么您可以安全地抑制警告。原则上使用泛型数组没有错。编译器只是在保护您免于意外执行此类操作。

【讨论】:

  • 这似乎对我有用,而无需使用抑制警告代码! :o
  • 好吧,我不知道为什么编译器会保护你免受这种情况的影响,因为在任何程序中都有很多事情可能出错......但我真的很喜欢这个答案。老实说,我确实认为根本不允许这样做,这对如此强大的想法似乎有点限制。投射它的方式有点奇怪,但我想我明白为什么它允许这样。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
相关资源
最近更新 更多