我刚刚看了“有效的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 {
}
非常感谢,我明白了。 –