要为类型 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
只要内部数组永远不会泄漏。
我正在尝试制作一个通用堆栈 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
只要内部数组永远不会泄漏。