2017-03-06 6 views
3

Je lisais pourquoi la covariance de tableau dans Java est mauvaise (Why are arrays covariant but generics are invariant?). Si un Dog est un sous-type de Animal, un Dog[] est un sous-type de Animal[]. C'est un problème parce que des choses comme ceci peuvent être faites:La covariance du tableau Java est-elle contraire au principe de substitution de Liskov?

Animal[] animals = new Dog[1]; 
animals[0] = new Cat(); 

Ceci est différent des génériques qui ont été implémentés 'correctement'. Un List<Dog> n'est pas un sous-type de List<Animal>

J'essayais de comprendre l'essence de la raison pour laquelle il est mauvais et je venais de lire à propos de LSP. At-il violé le LSP de quelque façon que ce soit? Il ne semble pas y avoir de violation claire.

Répondre

4

At-il violé le LSP de quelque façon que ce soit?

Oui.

Il ne semble pas y avoir de violation manifeste.

Votre propre exemple est une violation. Le code suivant fonctionne très bien:

Animal[] animals = new Animal[1]; 
animals[0] = new Cat(); 

Mais si maintenant remplacer le Animal[] avec son sous-type Dog[], le code ne fonctionne plus (qui est, il fait une exception quand il n'a pas auparavant). Donc, le type Dog[] ne peut être utilisé nulle part où son supertype Animal[] peut être utilisé et qui viole le LSP.

Pour mettre cela dans le libellé du LSP: Si l'on considère la propriété « new Cat() peut être désigné comme un élément », le type Animal[] remplit cette propriété, mais son sous-type Dog[] ne fonctionne pas.