Pourquoi HashMap implémente-t-il Map s’il étend AbstractMap?

Dupliquer possible:
Java.util.HashMap – pourquoi HashMap étend AbstractMap et implémente Map?

En Java pour implémenter HashMap nous devons implémenter Map .

Cependant, lorsque j’ai débogué davantage dans les classes java, il semble que …. java définit la classe HashMap comme suit.

public class HashMap extends AbstractMap implements Map, Cloneable, Serializable

En même temps, j’ai vu public abstract class AbstractMap implémenter Map mais également l’interface Map .

Si la classe abstraite implémente l’interface, quelle est la raison de l’implémentation de Map au niveau de la classe HashMap ?

Selon ma compréhension, la classe HashMap a toutes les méthodes héritées de AbstractMap qui peuvent être remplacées par HashMap selon les besoins.

Je crois que le raisonnement derrière ceci est qu’une classe abstraite en Java n’a pas besoin de déclarer / implémenter toutes les méthodes de l’interface. Ainsi

 public interface MyInterface{ void a(); void b(); void c(); } 

l’implémentation abstraite suivante de l’interface est valide.

 public abstract class AbstractClass implements MyInterface { public void a() {} public void c() {} public void d() {} } 

Ainsi, je crois que pour être explicite à propos de HashMap implémentant les méthodes non implémentées par la classe abstraite, il est montré qu’il implémente l’interface Map alors que cela est complètement facultatif, car toute implémentation de la classe abstraite doit implémenter toutes les méthodes la classe abstraite ou la classe de base dérivée. Ainsi, dans l’exemple ci-dessus, une implémentation valide de la classe abstraite est

 public class MyClass extends Abstract{ public void a() {} public void c() {} public void b() {} //if you dont implement this, comstack error public void d() {} } 

que vous pouvez également écrire comme suit:

 public class MyClass extends Abstract implements MyInterface { public void a() {} public void c() {} public void b() {} public void d() {} } 

C’est probablement juste pour rendre les choses plus évidentes. En gros, vous pouvez voir directement dans le code de cette classe que HashMap implémente l’interface Map . Oui, cela étend déjà AbstractMap , mais c’est probablement considéré uniquement comme un détail d’implémentation.

Il n’y a rien de mal à réimplanter des interfaces Cela ne change pas la façon dont le code est compilé, mais cela aide certainement parce que vous le voyez immédiatement. Vous n’avez pas besoin de gravir la hiérarchie des classes ou de charger les documents de l’API en premier.

Dans ce cas particulier, il s’agit uniquement de documentation; c’est-à-dire qu’il est clair pour le lecteur qu’il s’agit d’ une implémentation de Map . Je suis à peu près sûr que le coût de cette redondance est négligeable.

(Et oui, votre compréhension est correcte.)

Le “implémente Map” est optionnel et est généralement là pour aider les gens à lire le code que HashMap implémente les méthodes d’interface de Map ainsi que les méthodes abstraites de AbstractMap.