2017-03-06 15 views
3

私はなぜJavaで配列の共分散が悪いのかを読んでいました(Why are arrays covariant but generics are invariant?)。 DogAnimalのサブタイプである場合、Dog[]Animal[]のサブタイプです。このようなことを行うことができますので、これは問題です:Java配列の共分散はLiskovの置換原理に違反していますか?

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

これは「正常」に実装されたジェネリック医薬品とは異なります。 A List<Dog>は、List<Animal>のサブタイプではありません

私はなぜそれが悪いの本質を理解しようとしていた、ちょうどLSPについて読んでいた。それは何らかの形でLSPに違反しましたか?明確な違反はないようです。

答えて

4

どのようにしてLSPに違反しましたか?

はい。

明確な違反はないようです。

あなた自身の例は違反です。次のコードは正常に動作しません:今すぐそのサブタイプDog[]Animal[]を交換する場合

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

しかし、コードはもはや作品(つまり、それは以前になかった例外が発生します)。そのため、タイプDog[]は、スーパータイプAnimal[]が使用され、LSPに違反する場所では使用できません。

LSPの文言でこれを置くために:私たちは財産を考えた場合、「new Cat()が要素として割り当てることができる」、タイプAnimal[]は、このプロパティを果たすが、そのサブタイプDog[]はしていません。

関連する問題