枚舉是常量。所以Stack disks
不能是「任何類型的枚舉客戶端想要的堆棧」。它必須是固定的類型。
在枚舉中包含字段的要點是能夠保存關於每個元素的附加信息。例如,在堆棧的情況下,這可以是A("a", "b")
,B("b", "c", "d")
-每個元素指定在其堆棧中加載哪些項目(該示例需要可變參數構造函數)。但是他們的類型是嚴格規定的,不能是<T>
。
是Eclipse編譯器顯示的錯誤是明顯的:
語法錯誤,enum聲明不能有類型參數
然而,你可以做這樣的事情:
enum Foo {
A("foo", "bar"),
B(0, 1, 2);
private Stack<?> stack;
private <T> Foo(T... args) {
stack = new Stack<T>();
stack.addAll(Arrays.asList(args));
}
public <T> Stack<T> getStack() {
return (Stack<T>) stack;
}
}
然後:
Stack<String> stack1 = Foo.A.getStack();
Stack<Integer> stack2 = Foo.B.getStack();
System.out.println(stack1);
System.out.println(stack2);
個
結果:
[foo, bar]
[0, 1, 2]
更新:因爲你對你的目標的評論 - 河內塔不應該是枚舉,因爲他們的觀念正在轉變。相反,您應該使用枚舉作爲Map
的鍵,其中的值是堆棧。我承認,使用枚舉域來做到這一點看起來很誘人,但這不是一個好習慣。枚舉更好地保持不變。當然,您可以使用上面的示例來實現您的初始目標,但我建議使用Map
。
你爲什麼想把堆棧放入一個枚舉? –
爲什麼人們傾向於提出與該主題無關的問題? – damluar
,因爲它與該主題有關。 – Bozho