Question

J'essaie de comprendre le comportement de Java. En utilisant ces interfaces:

public interface IA {}
public interface IB extends IA {}
public class myClass implements IB {}

Je surcharge une méthode comme celle-ci:

public void method(IA a);
public void method(IB b);

Lors de l'appel d'une méthode avec l'objet suivant:

IA a = new myClass();
method(a);

Pourquoi Java utilise-t-il:

 public void method(IA a);

au lieu de

public void method(IB b);

?

Merci

Était-ce utile?

La solution

Parce que le compilateur sait seulement que un est une instance de IA . Les surcharges sont déterminées au moment de la compilation en fonction des types de compilation des expressions impliquées, et le type de compilation a est IA .

(Comparez cela avec le remplacement, où l'implémentation de la méthode est choisie à l'heure d'exécution en fonction du type réel impliqué.)

Autres conseils

La ligne

 IA a = new myClass();

définit l'objet a comme type IA et c'est tout ce que le compilateur sait. Il ne peut pas supposer que a est également IB car il est tout à fait possible que cela soit vrai:

 public class MyClass2 implements IA{}

 IA a = new MyClass2();
 method(a);

auquel cas, a n'est PAS un IB comme dans votre exemple. Le compilateur ne fait donc aucune hypothèse sur le type autre que ce que vous fournissez. Il doit donc appeler la méthode qui accepte l’IA.

Parce que vous passez "a", qui est un argument IA.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top