要为类型 Class<T[]> 传递的参数

Parameter to pass in for type Class<T[]>

我正在尝试制作一个通用堆栈 class,如图所示

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[]>

现在我卡住了。

您可以通过在 class 名称后添加 [] 来引用类型化数组:

myStack = new Stack<MyClass>(MyClass[].class, 100);

此实现的整体设计很脆弱。我们正在混合两种语言结构:数组和泛型。这两种构造在两个主要方面有所不同:数组是协变的和保留的,而泛型是不变的和擦除的(参见 this question by eagertoLearn 为什么)。混合两者是灾难的根源。
此外,我们需要组件类型来调用Array::newInstance。现在,我们传递容器类型。

我建议使用 Object[] 作为支持数据结构,并使访问器通用以保证类型安全。这也是ArrayList采取的做法。这种方法将导致(至少)一个无法避免的未经检查的转换。我把它留给 reader 到

  • ArrayList
  • 中找到未检查的演员表
  • 争论为什么转换被纠正并且永远不会产生实际的 ClassCastException 只要内部数组永远不会泄漏。