lorsque je crée un objet dans ce format List obj = new LinkedList()
Pourquoi suis-je incapable d'accéder aux méthodes LinkedList
?Pourquoi ne puis-je pas accéder aux méthodes LinkedList avec l'objet de type référence de liste
Répondre
Avec
List obj = new LinkedList()
Qu'est-ce que vous avez est un List
. Vous avez "stocké" le LinkedList
dedans mais vous le traitez comme List
.
D'autre part, avec: -
LinkedList obj = new LinkedList()
Vous pouvez le traiter comme un LinkedList
compilateur cause ne marche pas savoir quel type de liste que vous utilisez, donc avec l'identification de type run-time vous ne pouvez utiliser que des méthodes d'interface, et ici, List is interface
Votre code crée une variable de type List (une interface).
Lorsqu'un autre code référence la variable obj, il ne peut que supposer que tout objet référencé à l'aide de la variable obj implémente l'interface List. Pour affirmer que l'objet référencé par obj est une liste liée, vous devez convertir l'obj en LinkedList, en supposant que l'implémenteur d'interface est une liste liée.
S'il est généralement bon de programmer avec des abstractions telles que des interfaces, si vous avez besoin d'accéder aux méthodes fournies par le type brut, cela indique que vous devez utiliser une référence au type brut (dans ce cas LinkedList) ou utiliser un interface autre que List qui fournit la méthode dont vous avez besoin.
LinkedList<String> myLinkedList = new LinkedList<>();
public void expectsList(List<String> maybeLinkedList){
maybeLinkedList.listInterfaceMethod(); // works ok
LinkedList linkedList = (LinkedList<String>) maybeLinkedList; // CAST may fail if obj is not a linked list
linkedList.linkedListMethod(); // If cast worked, this works
}
public void expectsLinkedList(LinkedList<String> aLinkedList){
aList.listInterfaceMethod(); // Works because linked list honors the List interface
List<String> list = aLinkedList; // also works because Linked list 'is a' kind of List
list.listInterfaceMethod(); // works ok
linkedList.linkedListMethod(); // We know the input object is a linked list
}
Notez que cette coulée est juste pour illustrer les types changeants - vous n'avez pas besoin de jeter pour résoudre votre problème dans ce cas.
car 'LinkedList' est caché dans supertype' List'. – matoni
Si vous avez besoin de méthodes 'LinkedList' spécifiques, utilisez simplement' LinkedList obj = new LinkedList <>() '. –
aUserHimself