[英]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[]>
現在我被困住了。
這個實現的整體設計是脆弱的。 我們混合了兩種語言結構:arrays 和 generics。 這兩個結構在兩個主要方面有所不同:arrays 是協變並保留的,而 generics 是不變的並被擦除(有關原因,請參閱eagertoLearn的這個問題)。 將兩者混合是災難的根源。
此外,我們需要組件類型來調用Array::newInstance
。 現在,我們傳遞容器類型。
我建議使用Object[]
作為支持數據結構並使訪問器通用以保證類型安全。 這也是ArrayList
采用的方法。 這種方法將導致(至少)一個無法避免的未經檢查的演員表。 我把它留給讀者
ArrayList
中找到未經檢查的演員表ClassCastException
。您可以通過在 class 名稱后添加[]
來引用類型化數組:
myStack = new Stack<MyClass>(MyClass[].class, 100);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.