Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Vous avez demandé le commentaire #604334.

Retourner sur le contenu associé.

Re: Interessant

Posté par benoar (Jabber id, ) le 23/07/2005 à 17:28. (lien). Évalué à 3.

Bon, je suis vraiment pas doué pour expliquer les choses, alors voici leur exemple :

class Stack[+A] {
  def push[B >: A](elem: B): Stack[B] = new Stack[B] {
   override def top: B = elem;
   override def pop: Stack[B] = Stack.this;
   override def toString() = elem.toString() + " " +
    Stack.this.toString();
  }
  def top: A = error("no element on stack");
  def pop: Stack[A] = error("no element on stack");
  override def toString() = "";
}

Si j'ai bien compris :
- le [+A] veut dire que le type A est covariant, et que donc une Stack[String] dérive d'une Stack[Object] (attention, je crois que Object n'existe pas, c'est plutot AnyRef ou Any qu'il faudrait utiliser, mais on m'aura compris ... j'espère)
- push est une méthode polymorphique (= générique), et [B >: A] veut dire que B est un super-type de A, bref, que A dérive de B. Donc, losrqu'on push un élément sur la pile :
s = s.push[Int](5)
le type retourné sera Stack[Int] (on peut ne pas préciser [Int], le type est inféré). Puis, si on fait
s = s.push(new Object())
(là je n'ai pas précisé [Object]), alors le type renvoyé sera Stack[Object], en bref, notre pile d'Int s'est transformée en pile d'Object. Bien sur, si on ne souhaite pas ce comportement, il suffit que la variable affectée (s) soit du type que l'on souhaite, et une erreur à la compilation sera détectée.

Bon c'est vrai qu'après on peut trouver la construction de cette pile assez étrange, car le code est vraiment fonctionnel plus qu'objet ici (cette pile est gérée à la manière des liste en Lisp, avec une tête et le reste). Au début j'ai eu du mal à comprendre def top: A = error("no element on stack"); !!!

Enfin voila, j'espère avoir été plus clair, sinon la page l'expliquant surement mieux :
http://scala.epfl.ch/intro/variances.html(...)

[ Répondre ]