• [^] # Re: Typage

    Posté par . En réponse au message débutant java : opérations de base sur les listes. Évalué à 1.

    Salut,

    Comme tu as le courage de répondre, j'ai complété un peu les choses, modifié deux ou trois trucs, pour une nouvelle version.

    L'exo se complexifie, on ne fait plus de print (ça, c'est un peu trop facile), mais une moyenne (ça pourrait être du max, du min, peu importe).

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collection;
    import java.util.List;
    public class ClassA {
     // here, you just say what types are accepted
     private class ClassB<I extends Integer, S extends String> {
     // it's a bit more wrapping, but for the fun
     private List<Object> l;
     public ClassB() {
     l = new ArrayList<Object>();
     }
     private void add(Class c, Object... params) throws Exception {
     l.addAll(checkIn(c, params));
     }
     // here we can do a bunch of checks. Choose your own. It's just the entry gate
     private Collection<? extends Object> checkIn(Class c, Object... params) throws Exception {
     if(params.length==1 && params[0].getClass().equals(c))
     return Arrays.asList(params[0]);
     //a bit ugly here. Something better can be done
     if(params[0].getClass().equals(c)) {
     return Arrays.asList(params);
     }
     throw new Exception("You shall not pass!");
     }
     public void addInt(I i) throws Exception {
     add(i.getClass(), i);
     }
     public void addManyInts(I... i) throws Exception {
     add(i[0].getClass(), i);
     }
     public void addString(S s) throws Exception {
     add(s.getClass(), s);
     }
     public void addManyStrings(S... s) throws Exception {
     add(s[0].getClass(), s);
     }
     public Object get(int i) {
     return l.get(i);
     }
     public int size() {
     return l.size();
     }
     private int getNumerOfNumbers() {
     int r=0;
     for(Object o:l) {
     if(o instanceof Number)
     r++;
     }
     return r;
     }
     // here we just want to do something more subtle than print
     public double getMean() throws Exception {
     int sum = this.getNumerOfNumbers();
     if(sum==0)
     throw new Exception("Maybe you want numbers...");
     double mean=0;
     for(Object o:l) {
     if(o instanceof Number) {
     mean+=((Number)o).doubleValue()/sum;
     }
     }
     return mean;
     }
     }
     public static void main(String[] args) throws Exception {
     ClassA a = new ClassA();
     a.doThings();
     }
     public void doThings() throws Exception {
     ClassB<Integer, String> maListeDeBidules = new ClassB<>();
     maListeDeBidules.addInt(1); // ok
     maListeDeBidules.addString("deux"); // ok
     maListeDeBidules.addManyInts(3,4,5,6,7,8); // ok
     maListeDeBidules.addManyStrings("neuf","dix","onze","douze","treize","quatorze"); // ok
     for(int i=0; i< maListeDeBidules.size(); i++)
     System.out.println("mon bidule "+(i+1)+" : "+maListeDeBidules.get(i));
     System.out.println("La moyenne dans ma liste de bidules est de : "+maListeDeBidules.getMean());
     }
    }

    J'ai suprimmé mon extends, comme ça, il n'y a que ce que j'expose qui est dispo. Dans la version précédente, j'avais commencé à préparer le boulot, tu vois que maintenant j'ai des méthodes avec varargs et du coup c'est assez pratique pour faire de l'ajout en masse.

    Voilà, comme tu m'a donné ta version des choses, j'ai pris un peu plus de temps pour t'en donner encore une autre ;)

    Pas sûr qu'elle te plaise toujours plus. Et c'est du POC, donc y'a certainement des choses à faire pour que ça marche mieux.

    Matricule 23415