我正在尝试制作一个通用的 Stack 类,如图所示
public class Stack<T> {
public Stack(Class<T[]> type, int capacity) {
this.capacity = capacity;
array = type.cast(Array.newInstance(type,capacity));
}
}
但是我不确定在实体化时应该输入什么型别,因为我想这样做
MyClass[] c = new MyClass[0];
myStack = new Stack<MyClass>(c.getClass(), 100);
但是我收到以下错误
Required type: Class <MyClass[]>
Provided: Class <capture of ? extends MyClass[]>
所以我想用
c.getClass().cast()\
但我不确定在 cast() 里面放什么,因为它不需要
Class<MyClass[]>
现在我被困住了。
uj5u.com热心网友回复:
这个实作的整体设计很脆弱。我们混合了两种语言结构:阵列和泛型。这两种结构在两个主要方面有所不同:阵列是协变的和保留的,而泛型是不变的和被洗掉的(请参阅eagertoLearn 的这个问题以了解原因)。混合两者是灾难的秘诀。
此外,我们需要组件型别来呼叫Array::newInstance
. 现在,我们传递容器型别。
我建议使用一个Object[]
作为后备资料结构并使访问器通用以保证型别安全。这也是ArrayList
. 这种方法将导致(至少)一个无法避免的未经检查的强制转换。我把它留给读者
- 找到未经检查的演员表
ArrayList
- 争论为什么演员被纠正并且永远不会导致实际
ClassCastException
,只要内部阵列永远不会泄漏。
uj5u.com热心网友回复:
您可以通过[]
在类名后添加来参考型别化阵列:
myStack = new Stack<MyClass>(MyClass[].class, 100);
0 评论