Es gibt nur wenige integrierte Klassen, die diese Schnittstelle implementieren, einschließlich ArrayList und TreeSet< /code>.
Die Schnittstelle definiert einige Methoden, zum Beispiel addLast und viele andere, obwohl diese ausreichen wird.
Wenn ich einen ArrayList-Typ verwende, wird der Code dies tun kompiliert und wird korrekt ausgeführt:
Code: Select all
var myArray = new ArrayList(List.of("a", "b"));
myArray.addLast("c");
Code: Select all
var myTree = new TreeSet(List.of("a", "b"));
myTree.addLast("c");
Das ist unpraktisch, denn wenn ich eine Methode habe, die einen SequencedCollection-Klassentyp als Parameter empfängt, muss ich im Methodenkörper (d. h. in der Instanz von) noch einmal erraten, ob das eigentliche als Parameter übergebene Objekt das Richtige ist Ich kann mit arbeiten.
Das ist eine andere Art auszudrücken, dass einige untergeordnete Elemente von SequencedCollection nicht ohne unerwartetes Verhalten anstelle der übergeordneten Klasse verwendet werden können.
Dies wiederum ist der Fall Anders ausgedrückt: Die SequencedCollection-Schnittstelle verstößt gegen das Liskov-Substitutionsprinzip (das L in SOLID).
Habe ich Verstehen Sie das Liskov-Substitutionsprinzip, indem Sie es anwenden dieses besondere Beispiel?