Wildcards

Points d'interrogation en Java

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Si un jour vous voyez que ? hérite d'une classe, ne soyez pas surpris. Il s'agit bel et bien de la programmation, et plus concrétement, de l'utilisation d'un wildcard.

Le wildcard fait partie des generics. Il est utilisé comme paramètre d'instantation des types génériques. Il trouve son utilité dans les situations où en implémentant une interface, on ne sait pas sur quels paramètres on va travailler. Pour mieux comprendre, regardons l'exemple :

import java.util.List;
import java.util.ArrayList;

public class TestWildcard {
    public static void main(String[] args) {
        setItemsToPrint();
    }

    public static void setItemsToPrint() {
        List<String> elements = new ArrayList<String>();
        elements.add("test1");
        elements.add("test2");
        printItems(elements);
    }

    public static void printItems(List<Object> items) {
        for (Object o : items) {
            System.out.println(o);
        }
    }
}

Si l'on essaie de compiler ce code, on reçoit une erreur :

TestWildcard.java:16: printItems(java.util.List<java.lang.Object>) in TestWildcard cannot be applied to (java.util.List<java.lang.String>) printItems(elements);

Pour faire marcher ce code et lui permettre d'utiliser les paramètres "universels" (Strings, Integers...), on doit faire appel à des wildcards. Cela va se traduire par ramplacer <Object> le fameux point d'interrogation. Voici le code correct :

import java.util.List;
import java.util.ArrayList;

public class TestWildcard {
    public static void main(String[] args) {
        setStringItemsToPrint();
        setIntegerItemsToPrint();
    }

    public static void setStringItemsToPrint() {
        List<String> elements = new ArrayList<String>();
        elements.add("test1");
        elements.add("test2");
        printItems(elements);
    }

    public static void setIntegerItemsToPrint() {
        List<Integer> elements = new ArrayList<Integer>();
        elements.add(1);
        elements.add(2);
        printItems(elements);
    }

    public static void printItems(List<?> items) {
        for (Object o : items) {
            System.out.println(o);
        }
    }
}

Le wildcard peut être également couplé avec l'utilisation du polymorphisme.

afficher le code

La compilation du code ci-dessus provoquera une erreur :

TestWildcardPolymorphisme.java:12: cannot find symbol
symbol  ee: method add(Rubber)
location: interface java.util.List<Pencil>
    penList.add(new Rubber());

Afin de le résoudre, il faut enlever la ligne penList.add(new Rubber()); car Rubber n'implémente pas l'interface Pencil. Voici le code correct :

afficher le code

::::::::::::::::::::::::::::::::::::::: TODO :::::::::::::::::::::: différence entre ? extends Class T extends Class
Bartosz KONIECZNY Standards du codage

Une question ? Une remarque ?

*

*

Un conseil CSS

Comment centrer verticalement les inputs type radio et checkbox ?

L'alignement vertical des inputs radio et checkbox peut se faire avec la propriété CSS, vertical-align. Par exemple :

<input type="radio" name="typeUser" id="pro-1" style="vertical-align:top;"/><label for="pro-1">Professionnel</label>