2010-06-02 6 views
3

J'avais initialement une interface comme ci-dessous.Conception de l'interface Java

public interface testMe { 
     public Set<String> doSomething(); 
} 
public class A implements testMe { 
     public Set<String> doSomething() { 
      return // Set<String> 
     } 
} 

J'ai eu des classes similaires implémentant testMe. Maintenant, je dois ajouter une classe qui retourne Set<Some Object>

public class X implements testMe() { 
    public Set<Some OBject> doSomething() { 
    } 
} 

Comment pourrais-je ajouter cette méthode dans l'interface sans casser des classes existantes?

Répondre

2

Vous ne pouvez pas le faire pour deux raisons.

  1. Une classe ou de l'interface ne peut pas avoir deux ou plusieurs méthodes qui ont le même nombre et le type de paramètres avec le même nom, mais différents types de retour; En raison de l'effacement de type, toutes les instances Set<...> sont, au moment de l'exécution, simplement Set, de sorte qu'elles auraient exactement le même type de retour de toute façon.

Vous devrez nommer la seconde quelque chose de différent.

La réponse plus complexe est que vous pouvez faire le type de paramètre extensible:

public interface TestMe<T extends Serializable> { 
    Set<T> doSomething(); 
} 

public class A implements TestMe<String> { 
    @Override 
    public Set<String> doSomething() { ... } 
} 

public class X implements TestMe<ASerializableObject> { 
    @Override 
    public Set<ASerializableObject> doSomething() { ... } 
} 
5

Vous pouvez utiliser

public interface testMe { 
    public Set<?> doSomething(); 
} 

Ou

public interface testMe { 
    public Set<? extends CommonSuperclass> doSomething(); 
} 
2

Je ne crois pas que vous pouvez parce que l'effacement du type gâchera l'effet que vous avez en tête.

Vous pouvez paramétrer l'interface:

import java.util.Set; 

public interface ISomething<T> 
{ 
    Set<T> doSomething(T [] data); 
} 

Et la mise en œuvre:

import java.util.HashSet; 
import java.util.Set; 

public class Something<T> implements ISomething<T> 
{ 
    public static void main(String[] args) 
    { 
     Something<String> something = new Something<String>(); 

     Set<String> set = something.doSomething(args); 
     System.out.println(set); 
    } 

    public Set<T> doSomething(T [] data) 
    { 
     Set<T> foo = new HashSet<T>(); 

     for (T x : data) 
     { 
      foo.add(x); 
     } 

     return foo; 
    } 
} 

Je ne sais pas ce que vous avez accomplit à l'esprit, cependant.

+0

Le problème ici est, je n'instancie pas les classes de béton directement mais encapsulé dans la méthode d'usine. Comment pourrait-on écrire méthode d'usine autour de ce retour ISomething ainsi que ISomething . Si nous paramétrons même l'usine, le problème est transféré au consommateur de la méthode. Il doit décider ce qui est retourné. – Nayn

Questions connexes