[英]Instantiating List<T> with generic type possible?
我正在輔導的一個學生正在參加一個Web開發課程,該課程使用的是Dietel關於Java的書,其中包含有關Generics的以下奇怪代碼:
class StackComposition <T>
{
private List<T> stackList;
public StackComposition()
{
stackList = new List<T>("stack") // ERROR
}
// .... more code
}
對於我來說,很明顯為什么這段代碼行不通,對於為什么老師建議學生以這段代碼為起點,我感到困惑。 也許我只是不了解泛型,而我的Java技能卻很不足,但是我看不到如何用泛型類型實例化泛型集合。 我看到的目的是通過使用通用的List集合並在運行時確定類型來創建Stack,但是我看不到使用上述配置怎么可能。 我的第一個傾向是告訴學生使用Generic Stack<T>
對象,而忘記編寫此自定義Stack類,但這顯然不是作業的目標。
我嘗試使用java.lang.reflect
包進行測試來解決此問題,但據我所知,它僅適用於非通用容器,例如Array
:
public StackComposition(Class<T> type)
{
Object obj = Array.newInstance(type, 10);
}
您的代碼中有兩個問題:
您正在嘗試使用非法的new
關鍵字實例化接口。 您應該改為實例化ArrayList
的對象(或實現List
的類)。
其次,不允許將String
引用傳遞給構造函數。
因此,這是您應該在代碼中使用的:
stackList = new ArrayList<T>();
或stackList = new ArrayList<T>(10);
如果要為stackList
賦予初始大小(將10
替換為您要初始化列表的大小)。
從純粹的指導性觀點來看,本練習可能是通過將某些方法轉發到某種更通用的包含實例來說明組成的。 僅需要公開所需的方法,並且可以根據需要更改內部使用的混凝土類型。
import java.util.Deque;
import java.util.LinkedList;
public class MyStack<T> {
private Deque<T> deque = new LinkedList<T>();
public void push(T item){
deque.push(item);
}
public T pop() {
return deque.pop();
}
public static void main(String[] args) {
MyStack<Integer> stack = new MyStack<>();
stack.push(42); // OK
stack.addFirst(0); // no such method
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.