2013-12-09 36 views
3

我剛剛看了「有效的Java」,我看到一個句子裏面說東西陣列和仿製藥之間的不同

因此,陣列提供運行時類型安全,但不編譯時類型安全和非專利藥反之亦然

我對此並不十分清楚,甚至在我讀完所有例子後,我感到困惑。任何人都可以向我解釋這一點,謝謝你。

回答

3

您不能在運行時更改數組(引用)的類型。但你可以編譯代碼試試就好了。

String[] strings = new String[1]; 
Object[] objects = strings; 
objects[0] = new Integer(1); // RUN-TIME FAILURE 

當你編譯您的應用程序,沒有錯誤會被編譯器拋出。另一方面,如果你使用泛型,當你編譯(構建)你的應用程序時,這會給你一個錯誤。

ArrayList<String> a = new ArrayList<String>(); 
a.add(5); //Adding an integer to a String ArrayList - compile-time failure 

換句話說,你並不需要真正運行應用程序和執行的代碼段,以發現問題。

請注意,編譯時間失敗比運行時間失敗更可取,因爲您在將問題發佈給用戶之前就已經發現了問題(之後就太遲了)!

+0

非常感謝,我明白了。 –

0

隨着泛型集合,該代碼,它試圖把一個整數爲一個字符串列表,給出在第二行編譯時錯誤:Cannot cast from List<String> to List<Object>

List<String> listOfStrings = new ArrayList<>(); 
List<Object> listAgain = (List<Object>)listOfStrings; 
listAgain.add(123); 

與陣列的等效代碼完全編譯,因爲它使用String數組作爲Object數組是合法的。 (從技術上講,陣列covariant。)

String[] arrayOfStrings = new String[10]; 
Object[] arrayAgain = arrayOfStrings; 
arrayAgain[0] = 123; 

但是,它不會是一個有效的字符串數組,如果它實際上包含整數,所以每一個操作來存儲東西它在運行時檢查。在運行時它是否會爆炸ArrayStoreException

+0

非常感謝你,也是一種很好的例子,這對我幫助很大。 –

0

Java Array提供協變返回類型,而泛型不提供協變返回類型。

讓我們從簡單的例子瞭解

public class GenericArrayDiff { 
    public static void main(String[] args) { 
     List<Vehicle> vehicleList = null; 
     List<Car> carList = null; 
     Vehicle[] vehicleArrays; 
     Car[] carArrays; 

     // illegal 
     carList = vehicleList; 
     // illegal 
     vehicleList = carList; 
     // illegal 
     carArrays = vehicleArrays; 
     // legal because array provides covariant return type 
     vehicleArrays = carArrays; 
    } 

} 
class Vehicle { 

} 
class Car extends Vehicle { 

}