【问题标题】:array of stacks堆栈数组
【发布时间】:2010-10-24 17:14:07
【问题描述】:

是否可以创建一个堆栈数组而不必在堆栈出来时进行强制转换? 当我执行以下操作时,Eclipse 会警告我无法创建通用的 Stack 数组:

Stack<Card>[] cards = new Stack<Card>[52];

【问题讨论】:

标签: java eclipse arrays generics


【解决方案1】:

好吧,数组不需要是泛型的,因为他总是这样定义的。为什么你认为你必须投?我认为日食在这里有些困惑。

【讨论】:

【解决方案2】:

为什么还要使用数组?

这是一个低级的编程结构。

如果您不想打扰初始化,请改用ListSet(例如org.apache.commons.collections.list.LazyList)。

至少

Arrays.asList(new Stack[52]) 将数组包装到列表中。

无论如何我都无法重现 jour 错误 .. :( 可能是因为设置了不同的警告/错误级别。

【讨论】:

  • 使用数组我可以限制其中的堆栈数量,因为列表是一个接口,列表的所有实现都不是我所需要的。
  • 见 org.apache.commons.collections.list.FixedSizeList
【解决方案3】:

您可以执行以下操作,但这会给您一个编译器“未经检查”的警告。

Stack<Card>[] cards = (Stack<Card>[]) new Stack[52];

【讨论】:

  • 哇,谢谢你记得我讨厌泛型 :) 老实说,让代码变得丑陋只是因为你愚蠢的 IDE 没有抱怨不是一个很好的理由。
  • 感谢您的回答,但我不想在它们出来时将它们投射出来。必须遵循一个不允许他们被淘汰的严格规范。
  • @Nobert Hartl:这不是 IDE,而是 Java 语言规范!
【解决方案4】:

这与类型擦除有关。基本上泛型类型只在编译时存在,在运行时不存在

请查看this forum post 以获得更好的解释。

【讨论】:

    【解决方案5】:

    Joshua Bloch 在Effective Java, Second Edition 中出色地描述了这个问题。 Check out the relevant section on Google Book Search.

    他提供的建议是更喜欢列表而不是数组。您的代码可能类似于:

    List<Stack<Card>> cards = new ArrayList<Stack<Card>>();
    

    【讨论】:

      【解决方案6】:
      Stack<Card>[] decks = new Stack[9];       // Declare
      Card c = decks[5].pop();                  // This compiles - java 'knows' the type
      Integer i = decks[4].pop();               // This will not compile
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-11
        • 2018-04-27
        • 2011-07-14
        • 2019-06-18
        • 2020-06-12
        • 2012-10-12
        相关资源
        最近更新 更多