Class<T[]> 类型传入的参数

nix*_*x_s 0 java generics stack casting class

我正在尝试制作一个通用的 Stack 类,如图所示

public class Stack<T> {
    public Stack(Class<T[]> type, int capacity) {
        this.capacity = capacity;
        array = type.cast(Array.newInstance(type,capacity));
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不确定实例化时要放入什么类型,因为我想做

MyClass[] c = new MyClass[0];
myStack = new Stack<MyClass>(c.getClass(), 100);
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误

Required type: Class <MyClass[]>
Provided: Class <capture of ? extends MyClass[]>
Run Code Online (Sandbox Code Playgroud)

所以我想用

c.getClass().cast()\
Run Code Online (Sandbox Code Playgroud)

但我不确定要在cast()中放入什么,因为它不需要

Class<MyClass[]>
Run Code Online (Sandbox Code Playgroud)

现在我被困住了。

Tur*_*g85 6

该实现的总体设计很脆弱。我们混合了两种语言结构:数组和泛型。这两种构造在两个主要方面有所不同:数组是协变的并且保留的,而泛型是不变的并且被删除的(请参阅eagertoLearn这个问题了解原因)。混合两者会导致灾难。 此外,我们需要组件类型来调用。现在,我们传递容器类型。
Array::newInstance

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

  • 找到未经检查的演员ArrayList
  • 争论为什么强制转换会被纠正,并且ClassCastException只要内部数组永远不会泄漏,就永远不会导致实际结果。