2009-07-12 7 views
4

Dans les situations où deux interfaces s'appliquent à un objet, et qu'il existe deux méthodes surchargées qui ne diffèrent qu'en distinguant ces interfaces, quelle méthode est appelée?Polymorphisme ambigu?

Dans le code.

interface Foo {} 
interface Bar {} 

class Jaz implements Foo, Bar {} 

void DoSomething(Foo theObject) 
{ 
    System.out.println("Foo"); 
} 

void DoSomething(Bar theObject) 
{ 
    System.out.println("Bar"); 
} 

Jaz j = new Jaz(); 
DoSomething(j); 

Quelle méthode sera appelée? DoSomething (Foo) ou DoSomething (Bar)? Ni l'un ni l'autre n'est plus spécifique que l'autre, et je ne vois pas pourquoi on devrait être appelé à la place de l'autre, sauf que l'un est spécifié premier/dernier.

EDIT: Et avec ce type de code est-il possible de forcer l'une ou l'autre méthode?

Répondre

10

Je suis assez sûr que la compilation ne sera pas ci-dessus. DoSomething(j) est un appel ambigu et entraînera une erreur.

Pour le compiler, vous auriez à jeter spécifiquement j comme Foo ou Bar lorsque vous appelez DoSomething, par exemple DoSomething((Foo)j).

12

Cela devrait être une erreur du compilateur.

Cela fonctionne:

DoSomething((Foo)j); 
DoSomething((Bar)j); 
0

C'est une ambiguïté dans les langues sans renommer, la plupart des langues. Votre meilleur pari est de construire deux classes qui implémentent l'interface séparément et font des appels sur l'objet maître en fonction de l'implémentation que vous devez exécuter.

Si vous souhaitez voir une langue dont la fonction est renommée, consultez Eiffel. http://dev.eiffel.com

0

Est est est ambiguos.

La signature de la méthode est la suivante: nom et les paramètres

ces méthodes sont différentes.

void Faire quelque chose (Foo theObject); // SIGNATURE EST: DoSomething, Foo

void DoSomething (Bar theObject); // SIGNATURE IS: DoSomething, Bar

+0

les méthodes elles-mêmes sont * pas * ambiguos, vous avez raison. Cependant, l'appel de méthode 'DoSomething (j)' est, puisque j est à la fois un Foo et un Bar. –

0

Si le compilateur est dans le doute, le programmeur doit lancer l'argument pour qu'il ne soit plus ambigu.

Essayez de passer "null" comme paramètre.