• [^] # Re: Typage

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

    Re-salut,

    Bien désolé pour l'implémentation moisie précédente pas bien vérifiée :( Et peut-être pour mon insistance/lourdeur.

    Mais j'aime bien les retours, et t'y vas assez cordialement :) (même si tu prends pas des pincettes, mais moi non plus...)

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.LinkedList;
    import java.util.List;
    public class ClassA {
     // here, you just say what types are accepted
     private class ClassB<I extends Integer, S extends String> implements Iterable {
     // it's a bit more wrapping, but for the fun
     private Collection c;
     public ClassB(Collection c) {
     // we could do better, just a bit of safety here
     if(!c.isEmpty())
     c.clear();
     this.c = c;
     }
     private void add(Object... params) throws Exception {
     this.c.addAll(checkIn(params));
     }
     private Collection<Object> checkIn(Object... params) throws Exception {
     // here we can do a bunch of checks. Choose your own. It's just the entry gate
     if(params.length==0)
     throw new Exception("You shall not pass!");
     return Arrays.asList(params); 
     }
     // do type checking here
     public <T extends I> void addBidules(T... t ) throws Exception {
     this.add(t);
     }
     public <T extends S> void addBidules(T... t ) throws Exception {
     this.add(t);
     }
     private int getNumerOfBidules(Class c) {
     int r=0;
     for(Object o:this.c) {
     if(c.isInstance(o))
     r++;
     }
     return r;
     }
     public Collection<Object> filter(Class c) {
     List<Object> r = new ArrayList<Object>();
     for(Object o:this.c) {
     if(c.isInstance(o))
     r.add(o);
     }
     return r;
     }
     public Iterator iterator() {
     return c.iterator();
     }
     }
     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<>(new LinkedList());
     maListeDeBidules.addBidules(1); // ok
     maListeDeBidules.addBidules("deux"); // ok
     maListeDeBidules.addBidules(3,4,5,6,7,8); // ok
     maListeDeBidules.addBidules("neuf","dix","onze","douze","treize","quatorze"); // ok
     int i = 0;
     for(Object o:maListeDeBidules) {
     System.out.println("mon bidule "+(i+1)+" : "+o);
     i++;
     }
     System.out.println("La moyenne dans ma liste de bidules est de : "+this.getMean(maListeDeBidules));
     // here we go!
     ClassB<Integer, String> maListeDeBidules2 = new ClassB<>(new ArrayList());
     for(i=0; i<10000000; i++)
     maListeDeBidules2.addBidules(i);
     }
     public double getMean(ClassB<Integer, String> b) throws Exception {
     Class<Number> c = Number.class;
     int n = b.getNumerOfBidules(c);
     if(n==0)
     throw new Exception("Maybe you want numbers...");
     double mean=0;
     for(Object v:b.filter(c)) {
     mean += ((Number)v).doubleValue()/n;
     }
     return mean;
     }
    }

    Donc voilà, que pense-tu de cette solution ?

    Il y a probablement plein de trucs à faire pour rendre ça exploitable (les throws Exception et plein d'autres trucs sûrement).

    Matricule 23415