我剛剛看了「有效的Java」,我看到一個句子裏面說東西陣列和仿製藥之間的不同
因此,陣列提供運行時類型安全,但不編譯時類型安全和非專利藥反之亦然
我對此並不十分清楚,甚至在我讀完所有例子後,我感到困惑。任何人都可以向我解釋這一點,謝謝你。
我剛剛看了「有效的Java」,我看到一個句子裏面說東西陣列和仿製藥之間的不同
因此,陣列提供運行時類型安全,但不編譯時類型安全和非專利藥反之亦然
我對此並不十分清楚,甚至在我讀完所有例子後,我感到困惑。任何人都可以向我解釋這一點,謝謝你。
您不能在運行時更改數組(引用)的類型。但你可以編譯代碼試試就好了。
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
換句話說,你並不需要真正運行應用程序和執行的代碼段,以發現問題。
請注意,編譯時間失敗比運行時間失敗更可取,因爲您在將問題發佈給用戶之前就已經發現了問題(之後就太遲了)!
隨着泛型集合,該代碼,它試圖把一個整數爲一個字符串列表,給出在第二行編譯時錯誤: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
。
非常感謝你,也是一種很好的例子,這對我幫助很大。 –
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 {
}
非常感謝,我明白了。 –