2009-08-31 8 views
0

Considérez les deux fichiers Java suivants qui contiennent une version simplifiée de mon problèmeinterface Java « Alias ​​»

#a.java 
package a; 
public interface I { 
//... 
} 

#b.java 
package b; 
public interface I { 
//... (different stuff from a.I) 
} 

Vous remarquerez dans mon projet, il y a deux interfaces nommées « I ». Cela ne peut pas être changé. Je suis dans une situation où j'ai besoin d'utiliser les deux types à l'intérieur d'une même classe. Maintenant, bien sûr, je pourrais juste référencer chacun de leurs types comme un.I et b.I, mais j'essaie de l'éviter pour rien d'autre que de maintenir la lisibilité.

Je veux faire quelque chose comme ça

interface B extends b.I { 

} 

Cela pourrait me laisser utiliser l'interface I en utilisant B et, et a.i comme juste je en important. Le problème est que cela ne fonctionne pas, prenons cet exemple concret en utilisant

interface MyList extends List<String> { 
} 

MyList l = new ArrayList<String>(); 

Cela génère une erreur de type. Pourquoi Java ne "sait" pas que MyList étend List?

Aussi, j'ai essayé coulée dans l'exemple ci-dessus, mais il génère un ClassCastException

pensées?

Répondre

6

Ceci est valable:

List<String> list = new MyList(); 

Ce n'est pas:

MyList l = new ArrayList<String>(); 

ArrayList est pas un MyList. Ils ont juste une superinterface commune. C'est pourquoi ça ne marche pas. Java "sait" MyList est un List mais cela ne signifie pas que vous pouvez lui affecter un List.

Considérez:

public interface MyList extends List<String> { 
    void foo(); 
} 

MyList l = new ArrayList<String>(); 
l.foo(); 

Il est évident que ArrayList n'a pas la méthode foo().

1

Java sait que MyList s'étend List<String>, mais il sait également parfaitement que ArrayList<String> n'implémente pas MyList. Je recommande fortement de supprimer les ambiguïtés de la manière la plus simple, la plus claire, la plus propre et la plus lisible: utilisez a.I et b.I!

1

Vous ne pouvez pas convertir ArrayList<String> en MyList car MyList n'est pas une super-classe ou une super-interface de ArrayList<String>. Imaginez que vous avez ajouté une méthode à MyList, par exemple MyList.swizzle(). Que se passerait-il si Java autorisait la distribution et que vous appeliez l.swizzle()?

Je ne pense pas que vous allez trouver une solution satisfaisante à cela puisque Java n'a pas d'instruction de renommage de type import as. Mais l'implémentation d'une interface pour ajouter ses membres à l'espace de nom de votre classe est contre-indiquée dans Java 1.5: si vous allez suivre cette route, essayez plutôt static import. C'est l'idiome préféré de nos jours pour faire ce que vous essayez de faire.

Questions connexes