堆栈数组

5

是否有可能创建一个堆栈数组而不必在它们出来时进行强制转换? 当我像下面这样做时,Eclipse会给出一个警告,说无法创建一个Stack的通用数组:

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

如果您使用四个空格缩进代码片段,它将正确格式化。 - Cogsy
类似的问题有一些很好的答案:https://dev59.com/7HVC5IYBdhLWcg3wrDJd - Andy White
我认为这是一个错误而不是警告,因为在Java中不允许 "new Stack <Card> [52]" - 有点隐蔽在这里:http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.3。 - user85421
添加注释 @SuppressWarnings("Unchecked")。 - Vanger
6个回答

9
Joshua Bloch在《Effective Java, Second Edition》中非常好地描述了这个问题。他提供的建议是优先使用列表而不是数组。您的代码可能看起来像这样:请查看Google图书搜索上相关的部分
List<Stack<Card>> cards = new ArrayList<Stack<Card>>();

3
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

2
您可以尝试以下方法,虽然这会导致编译器出现“未经检查”的警告。
Stack<Card>[] cards = (Stack<Card>[]) new Stack[52];

哇,谢谢你提醒我我讨厌泛型 :) 老实说,为了让你愚蠢的IDE不抱怨而使代码变丑是不好的理由。 - Norbert Hartl
谢谢你的回答,但我不想在它们出来时进行强制转换。必须遵循严格的规范,不允许将它们强制转换。 - codingForFun
@Nobert Hartl:问题不在于集成开发环境,而在于Java语言规范! - user85421

1

你为什么还在使用数组呢?

这是一种底层的编程结构。

如果你不想麻烦地初始化,可以使用ListSet(例如org.apache.commons.collections.list.LazyList)代替数组。

或者至少可以使用 Arrays.asList(new Stack[52]) 将数组包装成列表。

我无法复现你的错误...可能是因为设置了不同的警告/错误级别。


使用数组可以限制其中的堆栈数量,因为列表是一个接口,列表的所有实现并不完全符合我的需要。 - codingForFun
请查看 org.apache.commons.collections.list.FixedSizeList。 - KitsuneYMG

0

嗯,数组不需要是通用的,因为它总是被定义为这样。你为什么认为你必须进行强制转换?我认为Eclipse在这里有点混淆了。


Eclipse不会混淆:“……如果元素类型不是可重用类型,则在编译时会出现错误……”请参见http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.3 - user85421

0

这与类型擦除有关。基本上,泛型类型仅在编译时存在,而在运行时没有任何存在。

请查看此论坛帖子以获得更好的解释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接