Java Language Covariance des tableaux


Exemple

Les tableaux d'objets sont covariants, ce qui signifie que, tout comme Integer est une sous-classe de Number , Integer[] est une sous-classe de Number[] . Cela peut sembler intuitif, mais peut entraîner un comportement surprenant:

Integer[] integerArray = {1, 2, 3};
Number[] numberArray = integerArray;  // valid
Number firstElement = numberArray[0]; // valid
numberArray[0] = 4L;                  // throws ArrayStoreException at runtime

Bien que Integer[] soit une sous-classe de Number[] , il ne peut contenir que des Integer s, et essayer d’attribuer un élément Long génère une exception d’exécution.

Notez que ce comportement est unique pour les tableaux et peut être évité en utilisant une List générique à la place:

List<Integer> integerList = Arrays.asList(1, 2, 3);
//List<Number> numberList = integerList;  // compile error
List<? extends Number> numberList = integerList;
Number firstElement = numberList.get(0);
//numberList.set(0, 4L);                  // compile error

Il n'est pas nécessaire que tous les éléments du tableau partagent le même type, tant qu'ils constituent une sous-classe du type de tableau:

interface I {}

class A implements I {}
class B implements I {}
class C implements I {}

I[] array10 = new I[] { new A(), new B(), new C() }; // Create an array with new
                                                     // operator and array initializer.

I[] array11 = { new A(), new B(), new C() };         // Shortcut syntax with array
                                                     // initializer.

I[] array12 = new I[3];                              // { null, null, null }

I[] array13 = new A[] { new A(), new A() };          // Works because A implements I.

Object[] array14 = new Object[] { "Hello, World!", 3.14159, 42 }; // Create an array with
                                                     // new operator and array initializer.

Object[] array15 = { new A(), 64, "My String" };     // Shortcut syntax 
                                                     // with array initializer.