Java程式設計經驗——怎樣建立泛型陣列?

Java程式設計中泛型是很多人都接觸到的問題,但是陣列是不能通過泛型建立的,因為我們不能建立不可具體化的型別的陣列。何為不可集體化?即不是一個實際存在的型別,因而不能例項化。今天就和大家分享下怎樣建立泛型陣列。

工具/原料

Java

Windows、linux

方法/步驟

首先看這個泛型:

public class TestGenericArray { private E[]elements; private int size=0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public TestGenericArray(){ elements=new E[DEFAULT_INITIAL_CAPACITY]; } public E pop(){ if(size==0){ throw new EmptyStackException(); } E reslut=elements[--size]; elements[size]=null; return reslut; }}

在new E[DEFAULT_INITIAL_CAPACITY];這一行會有編譯錯誤,告訴你不能建立泛型陣列。具體見下圖。

Java程式設計經驗——怎樣建立泛型陣列

那我們要怎麼做呢?有兩種辦法解決上面的錯誤,第一種是通過建立一個Object型別的陣列,然後顯示轉換為E[]型別。見下面的程式碼:

import java.util.EmptyStackException;public class TestGenericArray { private E[]elements; private int size=0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public TestGenericArray(){ elements=(E[])new Object[DEFAULT_INITIAL_CAPACITY]; } public E pop(){ if(size==0){ throw new EmptyStackException(); } E reslut=elements[--size]; elements[size]=null; return reslut; }}注意此時在 elements=(E[])new Object[DEFAULT_INITIAL_CAPACITY];這一行會有編譯警告,提示我們這個Type safety: Unchecked cast from Object[] to E[],型別安全的警告,即沒有檢驗從Object陣列轉化為E的型別安全性。這種做法雖然能夠消除編譯錯誤,但是有警告,也就是告訴我們這樣不是型別安全的。如果這樣做我們必須自己保證elements陣列中的資料是型別安全的才可以這樣做。當我們確認未受檢的轉換是型別安全的,那麼我們要在最小的範圍內禁止警告。

Java程式設計經驗——怎樣建立泛型陣列

另外一種能夠消除建立泛型陣列錯誤的是宣告陣列域時,直接宣告為Object型別的陣列,當獲取陣列元素時把對應的元素轉換為E泛型型別。

public class TestGenericArray { private Object[]elements; private int size=0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public TestGenericArray(){ elements=new Object[DEFAULT_INITIAL_CAPACITY]; } public E pop(){ if(size==0){ throw new EmptyStackException(); } E reslut=(E)elements[--size]; elements[size]=null; return reslut; }}

第二種方法的重點在陣列宣告和獲取元素上面。但是這種做法會有警告,見下圖。同上面的方法一樣,同樣提示的是未受檢的型別轉換問題。可以通過@SuppressWarning註解取消警告,但是要在儘可能小的範圍禁止,否則編譯器能做的正常檢測也會被禁止,通常不要在類上加該註解。加註解後的程式碼見圖2.

Java程式設計經驗——怎樣建立泛型陣列

Java程式設計經驗——怎樣建立泛型陣列

綜合兩種方法,其實本質上都沒有建立泛型陣列,java也不允許這樣做。只是通過建立Object陣列然後轉化為泛型型別而已。方法一是一次性轉換整個陣列,而方法二是每次取陣列元素時才進行轉換,實際上都是相同的處理。

相關問題答案