天天看點

第16章 數組

  1. java支援建立持有泛型的數組對象:
public static void test04() {
        class Peel<T> {

        }

        class Banana {

        }

        class Apple {

        }

        // 建立泛型數組:
        Peel<Banana>[] peels = new Peel[10];
        // 可以放Peel<Banana>對象:
        peels[0] = new Peel<Banana>();
        // 不能放Peel<Apple>對象:
        //! peels[1] = new Peel<Apple>();
    }
           

但是數組是協變類型的,即它支援向上轉型,一旦某個自定義泛型數組向上轉型為Object數組,那麼它就可以接收任何類型的對象,泛型數組就不存在任何意義了:

public static void test02() {
        List<String>[] lists = new List[10];
        lists[0] = new ArrayList<String>();
        // List<String>[]不支援ArrayList<Integer>:
        //! lists[1] = new ArrayList<Integer>();
        Object[] objects = lists; // 向上轉型之後,就可以添加ArrayList<Integer>對象
        objects[0] = new ArrayList<Integer>();
    }
           

事實上,泛型容器總是比泛型數組更好的選擇。

  1. 在類或方法的内部,不能直接建立泛型數組:
class Peel<T> {
    // Type parameter 'T' cannot be instantiated directly
    // T不能直接執行個體化:
    //! T[] t = new T[10];
    // 可以先建立Object[]數組,再轉型:
    Object[] objects = new Object[10];
    T[] ts = (T[]) objects; // Unchecked cast: 'java.lang.Object[]' to 'T[]'
}
           

繼續閱讀