2011-01-16 6 views
3

Quelqu'un pourrait me conseiller comment je pourrais rendre ce code plus générique? J'ai essayé quelques manières mais j'ai du mal à remplacer la partie 'Integer' du code. Le code doit passer une fonction en paramètre à une autre fonction pour incrémenter une liste d'ints (mais évidemment si c'était générique ce serait des objets).Exemple de Java Generics

Merci à l'avance

public static void main(String[] args) { 
    Integer[] strArray = new Integer[]{1,2,3,4,5}; 

    List numbers = Arrays.asList(strArray); 
    doFunc(numbers, new IFunction() { 
     public void execute(Object o) { 
      Integer anInt = (Integer) o; 
      anInt++; 
      System.out.println(anInt); 
     } 
    }); 
    for(int y =0; y<numbers.size();y++){ 
     System.out.println(numbers.get(y)); 
    } 
} 

public static void doFunc(List c, IFunction f) { 
    for (Object o : c) { 
     f.execute(o); 
    } 
} 

public interface IFunction { 
    public void execute(Object o); 
} 
+0

I pour on ne peut pas comprendre ce que question que vous posez ici. «Générique» signifiant <et> ou «générique» signifiant généralisé? – bmargulies

+0

Comment est-ce pas une vraie question? – BoltClock

+0

Messr Margulies devrait google/bing sur "Génériques Java" avant de faire le commentaire. –

Répondre

2

Voici une version de votre code qui utilise des génériques et évite moulages:

public static void main(String[] args) 
{ 
    Integer[] strArray = new Integer[] {1, 2, 3, 4, 5}; 

    List<Integer> numbers = Arrays.asList(strArray); 
    doFunc(numbers, new IFunction<Integer>() 
    { 
     public void execute(Integer anInt) 
     { 
      anInt++; 
      System.out.println(anInt); 
     } 
    }); 
    for (int y = 0; y < numbers.size(); y++) 
    { 
     System.out.println(numbers.get(y)); 
    } 
} 

public static <T> void doFunc(List<T> c, IFunction<T> f) 
{ 
    for (T o : c) 
    { 
     f.execute(o); 
    } 
} 

public interface IFunction<T> 
{ 
    public void execute(T o); 
} 
+0

Salut merci, alors est-ce que je le prends que je ne peux pas éviter le type 'Integer' déclaré dans la définition de public void execute? – Jason

+0

Je suppose que vous pourriez le déclarer comme 'Number' à la place et ensuite utiliser' System.out.println (aNumber.intValue() + 1) '. – Martin

+1

@Jason - si vous faites référence à l'utilisation de génériques de la forme ' T doFn (T t) {return t + 1;}' alors non, ce n'est pas possible en Java. – McDowell