2013-12-09 39 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 { 

}