簡體   English   中英

為 Class 類型傳入的參數<t[]></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[]>

現在我被困住了。

這個實現的整體設計是脆弱的。 我們混合了兩種語言結構: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM