2009-10-21 9 views
4

J'essaie de comprendre le comportement de Java. En utilisant cette interface:Java Méthode de surcharge avec interface héritée

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

Je surcharge une méthode comme ceci:

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

Lorsque vous appelez méthode avec l'objet suivant:

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

Pourquoi utilise-t-java:

public void method(IA a); 

au lieu de

public void method(IB b); 

?

Merci

Répondre

14

Parce que le compilateur sait seulement que a 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 dépassement, où la mise en œuvre de la méthode choisie à l'exécution temps en fonction du type réel impliqué.)

+2

Oui. & @paul Et jetez un oeil à la répartition des visiteurs et google double expédition pour d'autres sujets connexes. – alphazero

3

Parce que vous passez « un », Wich est un argument IA.

4

La ligne

IA a = new myClass(); 

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

public class MyClass2 implements IA{} 

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

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