我正在嘗試制作一個通用的 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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/400806.html
