在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ java 泛型問題?

java 泛型問題?

public class Plate<T> {
    private T   item;
    public Plate(T t){
        item=t;
    }
    public  void set(T t){
        item=t;
    }

    public T get(){
        return item;
    }

    public static void main(String[] args) {
        Plate<String> [] arr=new Plate[10];
        //Plate<String> [] arr2=new Plate<>[10];//編譯錯誤
        Plate<Integer> plate=new Plate<>(1);
        Object[] arr1=arr;
        arr1[0]=plate;
        String a=arr[0].get();
    }
}

請問為什么

Plate<String> [] arr=new Plate[10]

不報錯,而

Plate<String> [] arr2=new Plate<>[10]

編譯錯誤,

這兩語句有什么不同?

-------------------------------后續(xù)補充--------------------------------

關(guān)于

in generics instantiation of arrays of parametrized types are illegal.

我是這樣理解的,以一個例子說明一下:

static void test() { 
  Pair<Integer,Integer>[] intPairArr = new Pair<Integer,Integer>[10] ; // error 
  addElements(intPairArr);  
  Pair<Integer,Integer> pair = intPairArr[1]; 
  Integer i = pair.getFirst(); 
  pair.setSecond(i); 
} 
static void addElements( Object[] objArr) { 
  objArr[0] = new Pair<Integer,Integer>(0,0); 
  objArr[1] = new Pair<String,String>("","");      // should fail with ArrayStoreException 
}

倘若支持,則我們調(diào)用addElements方法時,將其向上轉(zhuǎn)型為Object[](數(shù)組支持協(xié)變,故編譯通過),則繼續(xù)添加元素時,則會編譯通過,這樣在運行時會出現(xiàn)arrayStoreException,Java引入泛型其中很重要的一點就是為了安全,將運行時的異常在編譯時就暴漏出來,避免出現(xiàn)由于數(shù)組支持協(xié)變而導(dǎo)致的一些異常在編譯期間無法發(fā)現(xiàn),可以說,不支持泛型對象數(shù)組的創(chuàng)建就是因為數(shù)組有協(xié)變這一特性。

而答案中所說到的關(guān)于Java不支持泛型數(shù)組很好理解,舉例說明:

 T [] arr=new T[10];

這里我們假設(shè)T為String,由于Java的泛型采用擦除機制,只作用于編譯時,編譯之后則T都轉(zhuǎn)化為Object,實際上創(chuàng)建的都是Object數(shù)組,則通過橋接方法轉(zhuǎn)化為String時,則明顯不對,故不支持泛型數(shù)組的創(chuàng)建。

我們可以通過迂回的方式來創(chuàng)建泛型數(shù)組,舉例說明:

    public T[] createArray(T[] arr){
        T[] array= (T[]) new Object[arr.length];
        for (int i = 0; i <arr.length ; i++) {
            array[i]=arr[i];
        }
        return  array;
    }

實際上將傳入的泛型數(shù)組copy到對應(yīng)的Object數(shù)組中了。

最后一個問題,什么原因?qū)е铝薐ava支持?jǐn)?shù)組協(xié)變這一可能出現(xiàn)問題的特性呢?

回答
編輯回答
懶豬

java中的泛型被設(shè)計為不能實例化泛型數(shù)組,類型擦除了解一下。

2017年9月14日 02:42
編輯回答
青檸

支持?jǐn)?shù)組協(xié)變是為了方便 方法重載 —— 因為 Java 剛出現(xiàn)的時候,Java 還沒有引入泛型,如果不支持?jǐn)?shù)組協(xié)變,那么對數(shù)組的某個操作,對不同類型便需要新寫一個方法,就像這樣:

public static void operate(String[] array) { ... }
public static void operate(Integer[] array) { ... }
public static void operate(SomeClass[] array) { ... }

而如果支持協(xié)變,那么便可以統(tǒng)一為:

public static void operate(Object[] array) { ... }

后來 Java5 之后 Java 引入了泛型機制,所以對數(shù)組的處理已經(jīng)可以統(tǒng)一抽象為泛型:

public static <T> void operate(T[] array) { ... }

所以現(xiàn)在數(shù)組協(xié)變的地位就很尷尬了 —— 大家都嫌棄它 —— 也是個歷史遺留的包袱吧。

2017年1月10日 03:36