Les templates

Helas, Java ne permet pas de creer des classes contenant des elements dont les types peuvent etre simplement redefinis. Il est possible de pallier en partie cette forte restriction (probablement due a des imperatifs de securite), mais cela releve quelque peu du bricolage comme le montre l'exemple de pile ci-dessous.

Programme : 

public class template

{

    static pile_int ma_pile ;

    public static void main(String[] args)

    {

      int i;

      ma_pile = new pile_int() ;

      for (i=0 ; i<11 ; i++) ma_pile.empile(i) ;

      for (i=0 ; i<11 ; i++) { System.out.println(ma_pile.valeur()) ; ma_pile.depile() ; }

    }

}

class pile

{

    protected Object[] p ;

    protected int max ;

    protected int sommet ;

    pile()

    { max = 10 ; sommet = 0 ; p = new Object[max] ; }

    public void empile(Object elt)

    {

      if (sommet<max){ p[sommet] = elt ; sommet ++ ; }

      else System.out.println("Pile pleine.") ;

    }

    public void depile()

    { if (sommet>=0) sommet -- ; else System.out.println("Pile vide.") ; }

    public Object valeur()

    { return(p[sommet]) ; }

    // Les methodes dont on est certain d'avoir a recrire le corps pourraient etre declarees abstract

    public void toto(A p1, int p2)

    { ; }

}

class pile_int extends pile

{

    protected int[] p ; // ne surchage ni max ni sommet

    // on n'a pas besoin de recrire les methodes ne manipulant pas explicitement le type object

    public void empile(int elt)

    {

      if (sommet<max) { p[sommet] = elt ; sommet ++ ; }

      else System.out.println("Pile pleine.") ;

    }

    // recriture inutile de depile()

    // La redeclaration suivante est impossible

    public int valeur()

    { return(p[sommet]) ; }

    // les parametres d'entree peuvent etre redefinis comme on veut

    public void toto(B p1, float p2, int p3)

    { ; }

}

class A

{ int a ; }

class B

{ String b ; }


Resultat de la compilation :

template.java:70 : Method redefined with different return type : int valeur() was java.lang.Object valeur()

Explications :

La classe Object etant la classe de plus haut niveau, il est possible de se servir de la classe pile ou est declare un tableau d'Object comme "modele" d'implantation de vraies piles (ici pile d'entiers). Helas, ceci n'est pas automatique et il faut completement recrire toutes les fonctions ou le type Object apparait explicitement et, probleme plus grave, Java n'autorise pas la redefinition du parametre de retour (comme dans la fonction valeur). Cette redefinition du parametre de retour d'une fonction n'est possible ni pour un type derive (i.e. int pour Object) ni pour un "sur-type" (i.e. Object pour int). La regle est donc :

Contourner l'absence du mecanisme de template n'est donc pas evident dans le cas general. Cette importante limitation nous parait fort regrettable.


Ph. RIS 1997